2010-10-02 150 views
4

之前我有C++的阵列:试验在C++ void指针删除

在析构

Player ** playerArray; 

其在类它是在构造函数中初始化我有:

delete playerArray; 

除了测试通过Valgrind的,它说,有一些呼吁删除对空指针的程序时:

operator delete(void*) 

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

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

+1

使用一个载体>(如果我正确理解你是如何使用它的话)或类似的类型(如[matrix](http://bitbucket.org/kniht/scraps/src/7354246cc9b6/) cpp/kniht/simple_matrix.hpp))。 – 2010-10-02 06:15:17

回答

5

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

+1

是的,似乎已经修复了问题 – 2010-10-02 04:32:51

+0

如果它是一些指向某些对象的指针数组,删除数组本身并不释放其地址存储在该数组中的对象。你需要一个'for'循环来删除这些对象,然后'delete []'这个数组。 – rwong 2010-10-02 07:29:18

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指针,而不是类型指针。如果SomeClass是POD,那可能是ok,但是如果它有一些关键的工作,它必须在它的析构函数中做,那个析构函数永远不会被调用。

3

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

void operator delete(void*) throw(); 
void operator delete[](void*) throw(); 

“运算符删除”拍摄由于指针的任何对象一个“无效*”可以被转换成“无效*”。

注意的空隙是一个不完整的类型,因此它是不允许删除一个void *即

char *p = new char; 
void *pv = p; 
delete pv;   // not allowed 

脚注78:这意味着,一个 对象不能使用 指针的被删除键入void *,因为void是 不是对象类型。

在playerarray是一个指向一组玩家的指针的情况下,你很可能想要做不同的事情。 delete pplayer不会做你想做的事。