之前我有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