刪除空指標的危險
在 C 中,記憶體管理至關重要,理解指標的正確用法至關重要。處理 void 指標時有常見問題:直接刪除 void 指標安全嗎?
問題:
考慮以下程式碼:
void *my_alloc(size_t size) { return new char[size]; } void my_free(void *ptr) { delete[] ptr; }
這段程式碼安全嗎,還是必須先將 ptr 轉換成 char*刪除?
答案:
C 標準明確禁止刪除 void 指標。第 5.3.5/3 節指出:
In the second alternative (delete array) if the dynamic type of the object to be deleted differs from its static type, the behavior is undefined.
這表示使用 void 指標刪除物件是未定義的,因為不存在 void 類型的物件。
簡單來說, void 指標沒有型別信息,因此它不能包含正確刪除分配的記憶體所需的資訊。透過 void 指標刪除可能會損壞記憶體堆並導致不可預測的行為或程式崩潰。
因此,必須避免透過 void 指標刪除,而是在刪除之前將 void 指標轉換為適當的型別。在給定的範例中,有必要在呼叫delete[] 之前將ptr 強制轉換為char*:
void my_free(void *ptr) { delete[] static_cast<char*>(ptr); }
透過遵循此做法,您可以確保正確釋放內存,避免潛在錯誤並維護您程序的完整性。
以上是在 C 中直接刪除空指標安全嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!