簡體   English   中英

Python 與 C++ 中的析構函數之間的區別

[英]Difference between a destructor in Python vs C++

C++ 析構函數和 Python 析構函數的契約有何不同,特別是與 object 生命周期和何時回收資源有關? 我還沒有找到全面的並排比較。

What I think a C++ destructor does is that it entirely frees the memory held by the object. And Python deregisters the object but it still remains in the cache memory (calling it garbage collection), and then frees the memory entirely after the program is complete .

C++ object 的生命周期從構造開始,到銷毀結束。 C++ 假設系統資源有限; 資源獲取即初始化。 這只是意味着每個獲取的資源都綁定到 object 並且必須在對象生命周期結束之前釋放:析構函數應該償還構造函數的債務。 否則會發生資源泄漏。 因此 C++ 定義了 4 個存儲類:

  1. 外部對象超越其他對象,它們在程序開始時(在 main 之前)創建並在退出時銷毀。

  2. Static 對象很像外部對象,但它們在構建時可能有點惰性,並且通常在外部對象之前被破壞(事情更復雜)

永遠不要忘記忘記初始化命令慘敗

  1. Automatic objects( function local objects or none static class data members) die when they go out of scope. Scope for function local variables is the closing curly brace } corresponding the nearest opening curly brace { that embrace the object. None-static data members are被他們的父母殺死。 disstructoin 的一般規則是,由於新成員建立在先驅的工作之上,每個 object 可能依賴於先前構造的對象的存在和有效性:因此自動對象按照構造(聲明)的相反順序被破壞。

  2. 動態物體是最危險的。 編譯器不會自動限制它們的生命周期; 但程序員必須這樣做。 一般規則是刪除由 new 創建的每個實例。 但這說起來容易做起來難。 因此,好的做法是避免使用裸新/刪除對,並堅持使用智能指針和通用容器庫,謹慎處理棘手的部分。

但這還不是全部。 為了根據 class 正確實施 RAII,必須熟悉著名的成語。 C++ 程序員必須能夠利用0/3/5 規則,並且他必須熟悉復制/交換習慣用法,以應對時間緊迫的情況。 沒有什么是必須的,但是這兩個習語可以作為一般情況的良好起點; 具體情況需要具體處理(例如,復制/交換不適合矢量)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM