空指標和物件刪除
在 C 中,空指標可用於儲存任何類型的物件的位址。出現一個常見問題:我們可以透過 void 指標安全地刪除物件嗎?
問題:
考慮以下程式碼:
void* my_alloc(size_t size) { return new char[size]; } void my_free(void* ptr) { delete [] ptr; }
這裡,my_alloc分配一個char陣列並傳回一個void指標。 my_free 嘗試刪除 void 指標指向的物件。
答案:
根據 C 語言,透過 void 指標而不進行強制轉換來刪除物件是未定義行為標準 (5.3.5/3)。這意味著該行為可能因編譯器和平台而異。
這種未定義行為的原因是編譯器無法確定要刪除的物件的實際類型。因此,無法保證調用正確的析構函數,可能會導致記憶體損壞或其他意外行為。
安全方法:
安全刪除透過 void 指標建立物件時,必須強制轉換為分配該物件的原始指標類型。這可確保呼叫正確的析構函數,並正確清理與該物件關聯的任何資源。
例如,在上面的程式碼中,應如下刪除:
char* ptr = (char*)my_alloc(size); delete [] ptr;
以上是我可以透過 C 中的空指標安全地刪除物件嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!