释放void指针 [英] freeing a void pointer

查看:236
本文介绍了释放void指针的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何释放void指针。

  struct vStruct {
void * vPtr;
struct vStruct * next;
};

struct vStruct sObj;
struct vStruct * sObjNew = sObj;

delete sObjNew-> vPtr; ----------->这是正确的方法删除void指针
delete sObjNew;

显示错误运算符'delete',应用于具有未定义行为的void *

解决方案

您不应该删除 void 指针。 delete 适用于特定类型(因此编译器知道应该调用哪个析构函数 - 如错误消息中所述)。



  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());

//当sObj被删除时,MyDataWrapper被
//删除(由于〜vStruct)和
//生效,分配的数据也被删除。

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


How to free a void pointer.

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;

Showing error Operator 'delete', applied to void* argument having has undefined behavior, and most likely does not invoke the object's destructor.

解决方案

You should not delete a void pointer. delete works for specific types (such that compiler knows, which destructor should be called - as stated in error message).

If you want to hold unspecified type in your structure, you have to wrap it somehow.

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.

Note, that it's a simple example, it can be written more aesthetically.

这篇关于释放void指针的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆