c 高階零(智慧型指標)

2021-10-02 15:19:33 字數 1633 閱讀 2283

1.智慧型指標智慧型指標就是個類,對普通指標進行封裝,不管函式三正常結束還是異常結束,他在析構函式中對指標可以進行智慧型釋放

2.普通指標普通指標在使用完成後需要進行手動釋放,且容易造成堆的記憶體洩漏(忘記釋放),二次釋放,使用智慧型指標可以避免這些問題

3 在c++11中智慧型指標分為3種

包含在標頭檔案中,分別為:shared_ptr、unique_ptr、weak_ptr

4,三種智慧型指標歸納:型別

功能缺點

shared_ptr

使用引用次數,當引用次數為0時自動釋放 賦 值引用-1 拷貝引用+1 離開作用域自動釋放

不能迴圈引用,避免乙個原指標被兩個shared指標引用

unique_ptr

只能指向乙個指標物件,離開作用域後自動釋放

不能拷貝,賦值

weak_ptr

作為shared_ptr的輔助智慧型指標,引用shared_ptr 原指標引用數不變,使用lock獲取原指標的資源

作為shared_ptr的管理者

2.1,shared_ptr 智慧型指標

shared_ptr多個指標指向相同的物件,使用引用計數,每乙個shared_ptr拷貝都指向相同的記憶體,每使用他一次,內部的引用》計數器+1,每析構一次-1,減為0時,自動刪除所指向的堆記憶體

拷貝使得原物件的引用計數增加1,賦值使得原物件引用計數-1,被賦值物件引用+1,當計數為0時,自動釋放記憶體。

*shared_ptr需要避免迴圈引用

理解下面一端**,就可理解shared_ptr:

#include #include using namespace std;

int main()

void dosomething()

}~parent()

};class child

void dosomething()

}~child()

};int main()

std::cout << wpp.use_count() << std::endl; // 1

std::cout << wpc.use_count() << std::endl; // 1

return 0;

}

正確引用:

#include #include class child;

class parent;

class parent

void dosomething()

}~parent()

};class child

void dosomething()

}~child()

};int main()

std::cout << wpp.use_count() << std::endl; // 0

std::cout << wpc.use_count() << std::endl; // 0

return 0;

}

c 智慧型指標

auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...

c 智慧型指標

很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...

c 智慧型指標

記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...