Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 释放空指针_C++_Pointers_Void Pointers - Fatal编程技术网

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.

请注意,这是一个简单的例子,它可以写得更美观。

如果其中一个答案解决了您的问题,请不要忘记将其标记为已接受,这样它将有助于进一步访问此网站。