2010-10-02 51 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不會做你想做的事。