這幾天比較好奇就是c++ 的智慧型指標在離開作用域之後是否會被銷毀,疑惑點來自自己寫的一段小**
int count = 0;
vector> observers;
typedef std::vector>::iterator iterator;
while (1) {
shared_ptrp(new foo);
weak_ptrw(p);
observers.push_back(w);
iterator it = observers.begin();
while(it != observers.end())
{cout《這一段**中,我會很好奇的發現在第一次呼叫之後智慧型指標p就掛掉了,因為weak_ptr這個指標是可以判斷出乙個物件是否存活的,當然你不要以為我在棧上頻繁的make_shared 指標就會變呦,在棧上申請的話一直是那一塊記憶體位址!然後我就去查詢了資料,寫了以下這個**
int main()
{// pthread_t thread1;
// pthread_t thread2;
// pthread_t thread3;
// pthread_create(&thread1, nullptr,threadone,nullptr);
// pthread_create(&thread2,nullptr,threadtwo,nullptr);
// pthread_create(&thread3,nullptr,threadthree,nullptr);
//// pthread_join(thread1,nullptr);
// pthread_join(thread2,nullptr);
// pthread_join(thread3,nullptr);
weak_ptrglobalptr;
{auto p = make_shared();
weak_ptrp2(p);
globalptr = p2;
cout《這個**其實也比較有意思了就是走出作用域之後,globalptr被銷毀掉了,輸出結果
0x5628df8eae80
0
其實智慧型指標在走出作用域之後就會觸發銷毀流程,削減計數器,計數器為0的話自然而然的就會銷毀掉智慧型指標,因為weak_ptr並不能增加shared_ptr的計數器(弱引用),這時候走出作用域後,p 的計數器就是0,這時候就被銷毀了,globalptr自然而然也被銷毀掉了,所以會出現0,當然如果我們把globalptr換成weakptr那麼就是沒有問題的 智慧型指標的乙個bug
先show乙個例項 class father father virtual void fun class mother mother virtual void test int a class son publicfather public mother son void fun int tmain...
編寫乙個智慧型指標類
比起一般指標,智慧型指標會自動地管理記憶體 釋放不需要的記憶體 而不需要程式設計師去操心。它能避免迷途指標 dangling pointers 記憶體洩漏 memory leaks 分配失敗等情況的發生。智慧型指標需要為所有例項維護乙個引用計數,這樣才能在恰當的時刻 引用計數為0時 將記憶體釋放。i...
自己實現乙個智慧型指標
要實現乙個智慧型指標主要實現下面幾個函式 1 建構函式 2 拷貝建構函式 3 析構函式 4 賦值運算子函式 5 獲取引用計數函式 重點 1 構造,拷貝構造 1 2 析構函式會使引用計數 1.3 賦值運算子會使之前的引用計數 1。使新賦值過來的引用計數 1 include template class...