C++ 释放空指针
如何释放空指针C++ 释放空指针,c++,pointers,void-pointers,C++,Pointers,Void Pointers,如何释放空指针 struct vStruct { void *vPtr; struct vStruct *next; }; struct vStruct sObj; struct vStruct *sObjNew = sObj; delete sObjNew->vPtr; -----------> Is this correct way to delete void pointer delete sObjNew; 显示错误运算符“delete”,应用于具有未定义
struct vStruct {
void *vPtr;
struct vStruct *next;
};
struct vStruct sObj;
struct vStruct *sObjNew = sObj;
delete sObjNew->vPtr; -----------> Is this correct way to delete void pointer
delete sObjNew;
显示错误运算符“delete”,应用于具有未定义行为的void*参数,并且很可能不会调用对象的析构函数。您不会删除void指针。为什么?因为: 应用于
void*
参数的“delete”具有未定义的行为,并且很可能不会调用对象的析构函数
编译器如何知道指针对象的类型?因此,调用哪个析构函数?(尽管它可能决定释放多少内存,这取决于分配机制。)
不要存储无效的*——使用“实”指针类型。如果您需要“隐藏”真正的类型,请考虑使用多态性而不是过时的C实践。
<代码> VPTR < /代码>是如何初始化的?
- 如果它指向结构不拥有的数据,则不能销毁它
- 如果它指向使用
创建的数据,您应该调用malloc
free
- 如果它指向使用
创建的数据,则在调用new
以允许调用正确的析构函数之前,需要将其强制转换为正确的(或兼容的)类型delete
请注意,示例代码不会编译,但表明根本没有初始化
vPtr
。您必须在创建的所有vStruct
实例中初始化vPtr
。试图释放未初始化的vPtr
将产生未定义的后果,但可能会崩溃。您不应删除无效的指针<代码>删除
适用于特定类型(例如编译器知道应该调用哪个析构函数-如错误消息中所述)
如果要在结构中保留未指定的类型,必须以某种方式将其包装
class DataWrapper
{
public:
virtual void * GetData() = 0;
virtual ~DataWrapper()
{
}
};
class MyDataWrapper
{
protected:
MyData * data;
public:
MyDataWrapper(MyData * newData)
{
data = newData;
}
void * GetData()
{
return data;
}
~MyDataWrapper()
{
delete data;
}
};
struct vStruct
{
MyDataWrapper * vPtr;
struct vStruct *next;
~vStruct()
{
if (vPtr != null)
delete vPtr;
}
};
vStruct sObj;
sObj.vPtr = new MyDataWrapper(new MyData());
// When sObj gets deleted, MyDataWrapper is
// deleted too (thanks to the ~vStruct) and
// in effect, the allocated data is deleted too.
请注意,这是一个简单的例子,它可以写得更美观。如果其中一个答案解决了您的问题,请不要忘记将其标记为已接受,这样它将有助于进一步访问此网站。