在删除之前测试C ++中的void指针

时间:2010-10-02 04:20:52

标签: c++ memory valgrind void-pointers delete-operator

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

Player ** playerArray;

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

在析构函数中我有:

delete playerArray;

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

 operator delete(void*)

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

有谁知道怎么做?

3 个答案:

答案 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 ,但是如果它必须在析构函数中执行一些关键工作,那么析构函数永远不会被调用。