關於智慧型指標析構函式原理隨筆(不能析構動態陣列)

2021-08-01 13:41:43 字數 720 閱讀 7337

總所周知,在std中有著auto_ptr和shared_ptr,其中auto_ptr是只允許被乙個指標所使用,即「受auto_ptrs管理的資源必須絕對沒有乙個以上的auto_ptr同時指向它」,也就是無論是拷貝構造或者賦值時都會讓原來的指標為null。

舉個例子:std::auto_ptrpinv1(new int(1));      std::auto_ptrpinv2(pinv1); //現在pinv2只向資源,pinv1指向null。  

pinv1 = pinv2  ;   //現在pinv1只向資源,pinv2指向null。

而shared_ptr則不會有上訴問題,是「引用計數型智慧型指標」。這裡不過多詳訴其實現原理,在c++ primer上說明的非常清楚,不明白的地方可以查閱。

這些個智慧型指標都在自己的析構函式中呼叫了delete,所以當乙個智慧型指標離開當前作用域時,會自動的呼叫析構函式,從而釋放資源,但是如果該資源是動態陣列則會引發未定義的錯誤,因為其在析構函式中不是呼叫的delete形式所以針對諸如std::auto_ptraps(new std::string[10]);或者 std::shared_ptrspi(new int[100]);等會用上錯誤的形式,所以當分配動態陣列時使用智慧型指標是個餿主意!

那要如何解決上訴問題呢?那就是用string或者vector去代替動態陣列既可!如果實在要使用針對陣列而設計的智慧型指標,則可以使用boost::scoped_array和boost::shared_array 類。

2018 7 6 隨筆 析構函式

析構函式與dispose 方法的區別 1.dispose需要實現idisposable介面。2.dispose由開發人員 呼叫,而析構函式由gc自動呼叫。3.dispose方法應釋放所有託管和非託管資源。而析構函式只應釋放非託管資源。因為析構函式由gc來判斷呼叫,當gc判斷某個物件不再需要的時候,則...

關於析構函式

q1 析構函式是幹什麼的?a1 析構函式用來釋放物件所分配的資源。舉例來說,lock 類可能鎖定了乙個訊號量,那麼析構函式將釋放該訊號量。最常見的例子是,當建構函式中使用了new,那麼析構函式則使用delete。q2 物件的析構順序?a2 與建構函式相反,先構造的後析構。如 乙個物件陣列構造順序是0...

析構函式 及 指標

第一層是系統認識的變數,比如int,int 這些變數系統會在生存週期結束後自動釋放的,當然,你也可以手動地將其釋放 第二層是指標指向的動態分配的空間,需要呼叫delete函式來釋放 類裡面定義的也無外乎這兩種 為何要寫析構函式?而且一般定義成 virtual 型別?你沒法去訪問類的priviate成...