可以通過void *上的delete []運算符釋放基本數據類型的數組。例如,在void指針上使用delete []運算符釋放內存
char* charPtr = new char[100]
void* voidPtr = (void*)charPtr;
delete[] voidPtr;
或者也可以通過使用delete操作符像
delete voidPtr
我不指望它來調用析構函數釋放。我只希望它釋放內存,無論哪個分配給新操作員。
可以通過void *上的delete []運算符釋放基本數據類型的數組。例如,在void指針上使用delete []運算符釋放內存
char* charPtr = new char[100]
void* voidPtr = (void*)charPtr;
delete[] voidPtr;
或者也可以通過使用delete操作符像
delete voidPtr
我不指望它來調用析構函數釋放。我只希望它釋放內存,無論哪個分配給新操作員。
不,這不是有效的,這是undefined behavior如果我們看一下C++ draft standard5.3.5
刪除說(重點煤礦前進):
操作數應指針的對象類型或類型爲。如果是類類型,則操作數會上下文隱式轉換(第4章)爲指向對象類型的指針。 delete-expression的結果有void類型。
和腳註78表示:
這意味着一個對象不能使用類型空隙的指針被刪除*因爲空隙不是一個對象類型。
在另一方面free確實允許您使用無效 *但分配必須通過malloc
,calloc
或realloc
一直。
爲什麼在操作符刪除僅將'void *'作爲參數時它是未定義的? http://en.cppreference.com/w/cpp/memory/new/operator_delete和http://www.cplusplus.com/reference/new/operator%20delete[]/分配器也是如此。分配和釋放函數採用'void *',它工作得很好。甚至可以打開MSVC和Mingw頭文件並查看.. – Brandon
@CantChooseUsernames'delete-expression'與'operator delete'不同。特別是,相關類型的析構函數在調用操作符之前被調用(這就是爲什麼操作符只需要一個'void *' - 沒有任何對象,只有存儲器。) – molbdnilo
@CantChooseUsernames這是'operator delete'哪個與[刪除表達式](http://en.cppreference.com/w/cpp/language/delete)不一樣。什麼使得這個UB是你違反了*必須*限制。 –
考慮到您沒有接受答案,它們是否有任何缺失細節? –