手動析構函式呼叫是否表示設計不良?
一般認為手動呼叫析構函數表示設計不良。但是,此規則也有例外。
需要手動析構函數呼叫的一種情況是,僅需要銷毀物件而不釋放其分配的記憶體。這通常發生在記憶體分配和釋放與物件構造和銷毀分開處理的情況下。在這種情況下,物件是透過在現有記憶體區塊上放置 new 來建構的,並手動呼叫析構函數來消除它們。
考慮以下範例:
char buffer[sizeof(MyClass)]; { MyClass* p = new(buffer)MyClass; p->dosomething(); p->~MyClass(); } { MyClass* p = new(buffer)MyClass; p->dosomething(); p->~MyClass(); }
另一個值得注意的實例,其中手動析構函式呼叫是 std::vector 使用的預設 std::allocator。元素是在push_back期間在向量內構造的,但記憶體是預先分塊分配的。因此,vector::erase 可以消滅元素,而不必釋放底層內存,特別是如果很快就會進行 Push_back 操作。
儘管手動析構函數呼叫偏離了嚴格的 OOP 原則,但它們可能適合記憶體管理的情況。獨立於物件生命週期。此外,在為此目的而設計的類別中本地實作此方法可以稱為健全設計。
以上是什麼時候手動呼叫析構函數是一個好的設計選擇?的詳細內容。更多資訊請關注PHP中文網其他相關文章!