我在C ++中有一个数组:
Player ** playerArray;
在它所在的类的构造函数中初始化。
在析构函数中我有:
delete playerArray;
除了通过Valgrind测试程序时,它说有一些调用要删除到void指针:
operator delete(void*)
我想在调用delete之前测试playerArray是否为void指针以避免此错误。
有谁知道怎么做?
答案 0 :(得分:5)
也许你的意思是delete [] playerArray
。如果指针是数组而不是单个实例,则需要[]
。
答案 1 :(得分:3)
以下是如何定义operator delete。
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:这意味着一个 使用a无法删除对象 void *的类型指针,因为void是 不是对象类型。
如果playerarray是指向玩家阵列的指针,则您很可能希望采用不同的方式。 delete pplayer
没有达到您想要的效果。
答案 2 :(得分:0)
我认为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,那可能 ok ,但是如果它必须在析构函数中执行一些关键工作,那么析构函数永远不会被调用。