關於智慧型指標的乙個有趣的筆記

2021-10-04 17:06:32 字數 1309 閱讀 8469

這幾天比較好奇就是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...