我在 C++ 中有一个数组:
Player ** playerArray;
它在它所在的类的构造函数中初始化。
在析构函数中我有:
delete playerArray;
除了通过 Valgrind 测试程序时,它说有一些删除 void 指针的调用:
operator delete(void*)
我想在调用 delete 之前测试 playerArray 是否为空指针以避免此错误。
有谁知道如何做到这一点?
我在 C++ 中有一个数组:
Player ** playerArray;
它在它所在的类的构造函数中初始化。
在析构函数中我有:
delete playerArray;
除了通过 Valgrind 测试程序时,它说有一些删除 void 指针的调用:
operator delete(void*)
我想在调用 delete 之前测试 playerArray 是否为空指针以避免此错误。
有谁知道如何做到这一点?
也许你的意思是delete [] playerArray
。您需要[]
if 指针是一个数组,而不是单个实例。
以下是操作员删除的定义方式。
void operator delete(void*) throw();
void operator delete[](void*) throw();
'operator delete' 采用'void *',因为指向任何对象的指针都可以转换为'void *'。
请注意,void 是不完整的类型,因此不允许删除 void * 即
char *p = new char;
void *pv = p;
delete pv; // not allowed
脚注 78:这意味着不能使用 void* 类型的指针删除对象,因为 void 不是对象类型。
如果 playerarray 是指向 Player 数组的指针,您很可能希望以不同的方式进行操作。delete pplayer
不做你想做的事。
我认为 valgrind 警告的是删除是在这样的上下文中发生的:
int foo(void *mydata){
{
SomeClass some_value = static_cast<SomeClass> mydata;
some_value.dosomething();
// now we're done with it
delete mydata;
}
虽然演员表很好,因为你碰巧知道 void 指针实际上是那种类型,你仍然在做一些可疑的事情,因为你删除的是 void 指针,而不是类型化的指针。如果SomeClass是 POD,那可能没问题,但如果它有一些必须在其析构函数中完成的关键工作,则该析构函数永远不会被调用。