C 允許在各種上下文中建立和銷毀物件。了解這些操作何時以及如何發生對於有效的資源管理和避免記憶體洩漏至關重要。
自動物件(局部變數):
當控制流退出其範圍(函數、區塊等)時,自動物件將按照其定義的相反順序被銷毀。如果在函數執行期間引發異常,則在傳播異常之前自動物件將被破壞。 重要提示:自動物件的析構函數永遠不應該拋出異常。
非本地靜態物件(全域變數):
在命名空間範圍內定義的靜態物件是main() 執行後依其定義的相反順序被破壞。如果異常離開靜態物件的析構函數,則呼叫 std::terminate。
本地靜態物件:
函數內定義的靜態物件在控制流進入其定義時建構首次。它們在 main() 執行後按照其定義的相反順序被破壞。同樣,它們的析構函數不應該拋出異常。
基類子物件和成員子物件:
成員子物件依照其定義的相反順序被析構,然後是基底類別子物件依照基本說明符清單。構造子物件期間的異常會導致在傳播異常之前破壞所有先前構造的子物件。析構函數負責釋放檔案、套接字等資源。
陣列元素依降序析構。元素構造期間的異常會導致在傳播異常之前破壞先前構造的元素。
臨時物件(在純右值表達式求值期間建立)在完整表達式被破壞時被破壞評價。臨時物件評估期間的異常會導致先前臨時物件的正確銷毀。如果使用純右值初始化本地引用,則臨時物件的生命週期將擴展到引用的範圍,從而防止懸空引用。
動態物件(指標) :
用new建立的動態物件會用delete銷毀。多次銷毀、存取已銷毀的物件或使用不正確的方式進行銷毀(例如,delete[])會導致未定義的行為。動態物件建構過程中的異常會導致異常傳播之前記憶體釋放。
動態陣列:
用 new[] 建立的動態陣列將以 delete[] 銷毀。多次破壞、不正確的破壞方式以及破壞後的訪問會導致未定義的行為。數組元素構造過程中的異常會導致先前構造的元素被破壞並釋放記憶體。
引用計數智慧指標:
std::shared_ptr 管理的動態物件在下列情況下被銷毀:最後一個shared_ptr物件共用該物件被破壞。使用智慧指標有助於防止記憶體洩漏並確保正確的清理。
以上是C 中的物件何時以及如何被銷毀?的詳細內容。更多資訊請關注PHP中文網其他相關文章!