释放void指针 [英] freeing a void pointer
本文介绍了释放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屋!
查看全文