4

我在 C++ 中有一个数组:

Player ** playerArray;

它在它所在的类的构造函数中初始化。

在析构函数中我有:

delete playerArray;

除了通过 Valgrind 测试程序时,它说有一些删除 void 指针的调用:

 operator delete(void*)

我想在调用 delete 之前测试 playerArray 是否为空指针以避免此错误。

有谁知道如何做到这一点?

4

3 回答 3

5

也许你的意思是delete [] playerArray。您需要[]if 指针是一个数组,而不是单个实例。

于 2010-10-02T04:23:51.283 回答
3

以下是操作员删除的定义方式。

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不做你想做的事。

于 2010-10-02T04:36:01.987 回答
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,那可能没问题,但如果它有一些必须在其析构函数中完成的关键工作,则该析构函数永远不会被调用。

于 2010-10-02T04:30:27.727 回答