最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

c++ 智能指針初步用法 unique_ptr/shared_ptr/weak_ptr

2023-04-03 15:32 作者:大衣哥編程  | 我要投稿

auto_ptr淺拷貝,帶來很多問題,已經(jīng)廢棄

1. unique_ptr內(nèi)存的所有者或者說管理者必須是唯一的,如進(jìn)入不同的模塊或者調(diào)用者,那么執(zhí)行所有權(quán)轉(zhuǎn)移,通過release釋放。
Student* p = new Student("lily");
??????? std::unique_ptr<Student> unique_p(p);
??????? unique_p.release(); // 使得unique_p釋放控制器,下一步才可將p的控制權(quán)交給unque_p2
??????? std::unique_ptr<Student> unque_p2(p); // 否則會(huì)
??????? std::unique_ptr<Student> unque_p2(unique_p);??? // 錯(cuò)誤,不能拷貝構(gòu)造,因?yàn)楹瘮?shù)已經(jīng)刪除

??????? std::unique_ptr<Student> unque_p2(std::move(unique_p)); // 移動(dòng)構(gòu)造可以,讓unique_p為空


2. shared_ptr: 內(nèi)存由多個(gè)指針變量共同使用,共同擁有內(nèi)存的所有權(quán),但是必須杜絕循環(huán)拷貝!并且 shared_ptr 需要維護(hù)的信息有兩部分:指向共享資源的指針;引用計(jì)數(shù)等共享資源的控制信息——維護(hù)一個(gè)指向控制信息的指針。
Student a;
??? std::shared_ptr<Student> ptra = std::make_shared<Student>(a);
??? std::shared_ptr<Student> ptra2(ptra);???? //拷貝構(gòu)造函數(shù)
??? std::cout << ptra.use_count() << std::endl;?? //2
??? ptra2 = nullptr;
??? std::cout << ptra.use_count() << std::endl;?? //1
??? ptra = nullptr;
??? std::cout << ptra.use_count() << std::endl;?? //0

當(dāng)引用計(jì)數(shù)為0的時(shí)候,則調(diào)用delete,釋放資源:

3. weak_ptr: 對(duì)內(nèi)存的使用僅僅是訪問而已,不涉及其生命周期的管理,資源的釋放只取決shared的計(jì)數(shù),當(dāng)計(jì)數(shù)為0時(shí),釋放資源,weak_ptr不控制資源的生命周期。
?// 解決循環(huán)引用
??? {
??????? std::shared_ptr<WeakNode> sp1(new WeakNode);
??????? std::shared_ptr<WeakNode> sp2(new WeakNode);
??????? sp1->next_ = sp2;
??????? sp2->pre_ = sp1;

??? }

class WeakNode
{
public:
?? ?int data_;

?? ?std::shared_ptr<WeakNode> pre_;
?? ?std::shared_ptr<WeakNode> next_;

?? ?~WeakNode()
?? ?{
?? ??? ?std::cout << "destruct..." << std::endl;
?? ?}

};

將成員pre_ 或 next_改為:weak_ptr類型即可:
class WeakNode
{
public:
?? ?int data_;
?? ?// 2個(gè)成員 一個(gè)改為 weak_ptr即可解決循環(huán)引用
?? ?std::weak_ptr<WeakNode> pre_;
?? ?std::shared_ptr<WeakNode> next_;

?? ?~WeakNode()
?? ?{
?? ??? ?std::cout << "destruct..." << std::endl;
?? ?}

};

改造后,解決循環(huán)引用,可以釋放:


c++ 智能指針初步用法 unique_ptr/shared_ptr/weak_ptr的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
梅州市| 芜湖县| 东乡县| 东辽县| 西青区| 伽师县| 南城县| 新绛县| 蓬莱市| 安塞县| 定安县| 静海县| 常宁市| 九江市| 瑞丽市| 珲春市| 龙井市| 天门市| 越西县| 新昌县| 桑日县| 龙南县| 昌江| 鄢陵县| 蓝田县| 莲花县| 沂水县| 邢台市| 宝丰县| 隆德县| 巴塘县| 颍上县| 渝中区| 农安县| 邓州市| 徐州市| 渑池县| 乌兰察布市| 宁都县| 阳原县| 黎城县|