2014-02-27 62 views
2

可以通過void *上的delete []運算符釋放基本數據類型的數組。例如,在void指針上使用delete []運算符釋放內存

char* charPtr = new char[100] 
void* voidPtr = (void*)charPtr; 
delete[] voidPtr; 

或者也可以通過使用delete操作符像

delete voidPtr 

我不指望它來調用析構函數釋放。我只希望它釋放內存,無論哪個分配給新操作員。

+0

考慮到您沒有接受答案,它們是否有任何缺失細節? –

回答

11

不,這不是有效的,這是undefined behavior如果我們看一下C++ draft standard5.3.5刪除說(重點煤礦前進):

操作數應指針的對象類型或類型爲。如果是類類型,則操作數會上下文隱式轉換(第4章)爲指向對象類型的指針。 delete-expression的結果有void類型。

和腳註78表示:

意味着一個對象不能使用類型空隙的指針被刪除*因爲空隙不是一個對象類型。

在另一方面free確實允許您使用無效 *但分配必須通過malloccallocrealloc一直。

+0

爲什麼在操作符刪除僅將'void *'作爲參數時它是未定義的? http://en.cppreference.com/w/cpp/memory/new/operator_delete和http://www.cplusplus.com/reference/new/operator%20delete[]/分配器也是如此。分配和釋放函數採用'void *',它工作得很好。甚至可以打開MSVC和Mingw頭文件並查看.. – Brandon

+1

@CantChooseUsernames'delete-expression'與'operator delete'不同。特別是,相關類型的析構函數在調用操作符之前被調用(這就是爲什麼操作符只需要一個'void *' - 沒有任何對象,只有存儲器。) – molbdnilo

+1

@CantChooseUsernames這是'operator delete'哪個與[刪除表達式](http://en.cppreference.com/w/cpp/language/delete)不一樣。什麼使得這個UB是你違反了*必須*限制。 –