auto ptr的兩種實現方式

2021-09-18 03:05:02 字數 1662 閱讀 4632

最開始auto_ptr的成員變數主要有t* _ptr 和 bool _owner,主要實現原理是在構造物件時賦予其管理空間的所有權,在拷貝或賦值中轉移空間的所有權,在析構函式中當_owner為true(擁有所有權)時來釋放所有權。

template class my_auto_ptr;

templatemy_auto_ptr::my_auto_ptr(t* ptr) :_ptr(ptr), _owner(true) {}

templatemy_auto_ptr::my_auto_ptr(my_auto_ptr& ap):_ptr(ap._ptr)

templatemy_auto_ptr& my_auto_ptr::operator=(my_auto_ptr& ap)

return *this;

}templatet* my_auto_ptr::operator->()

templatet& my_auto_ptr::operator*()

templatemy_auto_ptr::~my_auto_ptr()

}

舊版auto_ptr出現的主要問題:如果拷貝出來的物件比原來的物件先出作用域或先呼叫析構函式,則原來的物件的_owner雖然為false,但卻在訪問一塊已經釋放的空間,原因在於拷貝物件的釋放會導致原物件的_ptr指向的內容跟著被釋放,這就造成指標的懸掛的問題。

int main() 	

*p1 = 20;;

return 0;

}

新版auto_ptr的實現方法還是管理空間的所有權轉移,但這種實現方法中沒有_owner許可權擁有者。構造和析構和上述實現方法類似,但拷貝和賦值後直接將_ptr賦為空,禁止其再次訪問原來的記憶體空間,比較簡單粗暴。

templateclass you_auto_ptr;

templateyou_auto_ptr::you_auto_ptr(t* ptr) :_ptr(ptr) {}

templateyou_auto_ptr::you_auto_ptr(you_auto_ptr& ap):_ptr(ap._ptr)

templateyou_auto_ptr& you_auto_ptr::operator=(you_auto_ptr& ap)

return *this;

}templatet& you_auto_ptr::operator*()

templatet* you_auto_ptr::operator->()

templateyou_auto_ptr::~you_auto_ptr()

}

這種實現方式很好的解決了舊版本野指標問題,但是由於它實現了完全的許可權轉移,所以導致在拷貝構造和賦值之後只有乙個指標可以使用,而其他指標都置為null,使用很不方便,而且還很容易對null指標進行解引用,導致程式崩潰,其危害也是比較大的。

int main()
說了這麼多,其實最終目的就是千萬別用這個已經被c++擯棄的庫函式,資源許可權的轉移帶來的是安全性的問題,當你理解了它的使用帶來的眾多記憶體洩漏,程式崩潰的例項時,相信你對這個智慧型指標也必須保持敬畏之心了。

參考:

兩種方式實現checkBox readonly功能

今天在做開發的時候遇到了這樣乙個問題 有乙個checkbox選項是不能被改變的。但是checkbox又是沒有readonly屬性的,這個時候我就想到了另外乙個屬性disabled,但是disabled的物件是不能提交到後台的,所以這個又被排除掉了。想了想,只能新增事件來搞定了。於是在checkbox...

TabHost兩種實現方式

第一種 繼承tabactivity,從tabactivity中用gettabhost 方法獲取tabhost。只要定義具體tab內容布局就行了.package com.example.testtabhost import android.os.bundle import android.view.l...

兩種方式實現checkBox readonly功能

今天在做開發的時候遇到了這樣乙個問題 有乙個checkbox選項是不能被改變的。但是checkbox又是沒有readonly屬性的,這個時候我就想到了另外乙個屬性disabled,但是disabled的物件是不能提交到後台的,所以這個又被排除掉了。想了想,只能新增事件來搞定了。於是在checkbox...