之前我有C++的阵列:试验在C++ void指针删除
在析构
Player ** playerArray;
其在类它是在构造函数中初始化我有:
delete playerArray;
除了测试通过Valgrind的,它说,有一些呼吁删除对空指针的程序时:
operator delete(void*)
我想在调用delete之前测试playerArray是否为void指针,以避免此错误。
有谁知道如何做到这一点?
之前我有C++的阵列:试验在C++ void指针删除
在析构
Player ** playerArray;
其在类它是在构造函数中初始化我有:
delete playerArray;
除了测试通过Valgrind的,它说,有一些呼吁删除对空指针的程序时:
operator delete(void*)
我想在调用delete之前测试playerArray是否为void指针,以避免此错误。
有谁知道如何做到这一点?
也许你的意思是delete [] playerArray
。如果指针是数组而不是单个实例,则需要[]
。
是的,似乎已经修复了问题 – 2010-10-02 04:32:51
如果它是一些指向某些对象的指针数组,删除数组本身并不释放其地址存储在该数组中的对象。你需要一个'for'循环来删除这些对象,然后'delete []'这个数组。 – rwong 2010-10-02 07:29:18
我想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,但是如果它有一些关键的工作,它必须在它的析构函数中做,那个析构函数永远不会被调用。
下面是操作员删除的定义方式。
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
不会做你想做的事。
使用一个载体>(如果我正确理解你是如何使用它的话)或类似的类型(如[matrix](http://bitbucket.org/kniht/scraps/src/7354246cc9b6/) cpp/kniht/simple_matrix.hpp))。 –
2010-10-02 06:15:17