【c++11 之智能指针2 unique、shared、weak *_ptr 原理及案例】及四种智能指针对比分析

C++11引入了智能指针(Smart Pointers)的概念,它们是一种自动管理内存的生命周期的指针类型,帮助开发者避免内存泄漏和野指针等问题。C++11标准库中定义了三种智能指针:std::unique_ptr、std::shared_ptr和std::weak_ptr。

原理

  1. std::unique_ptr:独占所有权模型,同一时间只能有一个unique_ptr指向某个对象,当unique_ptr被销毁(例如离开作用域)时,它所指向的对象也会被自动删除。
  2. std::shared_ptr:共享所有权模型,多个shared_ptr可以指向同一个对象,对象的生命周期会持续到最后一个拥有它的shared_ptr被销毁。当最后一个shared_ptr被销毁时,对象会被自动删除。shared_ptr使用引用计数(reference counting)来实现。
  3. std::weak_ptr:弱引用模型,weak_ptr是对对象的一种弱引用,它不会增加对象的引用计数。它主要用于解决shared_ptr之间的循环引用问题。

使用案例

std::unique_ptr

#include <memory>  
  
class MyClass {  
public:  
    MyClass() { std::cout << "MyClass created\n"; }  
    ~MyClass() { std::cout << "MyClass destroyed\n"; }  
};  
  
int main() {  
    std::unique_ptr<MyClass> ptr(new MyClass()); // 分配并初始化  
    // 当ptr离开作用域时,MyClass对象会被自动删除  
    return 0;  
}

std::shared_ptr

#include <memory>  
#include <iostream>  
  
class MyClass {  
public:  
    MyClass() { std::cout << "MyClass created\n"; }  
    ~MyClass() { std::cout << "MyClass destroyed\n"; }  
};  
  
int main() {  
    std::shared_ptr<MyClass> ptr1(new MyClass()); // 分配并初始化  
    std::shared_ptr<MyClass> ptr2 = ptr1; // ptr2和ptr1共享同一个对象  
  
    // 当ptr1和ptr2都离开作用域时,MyClass对象才会被删除  
    return 0;  
}

std::weak_ptr 解决循环引用

#include <memory>  
#include <iostream>  
  
class A;  
class B;  
  
class A {  
public:  
    std::shared_ptr<B> b_ptr;  
    ~A() { std::cout << "A destroyed\n"; }  
};  
  
class B {  
public:  
    std::weak_ptr<A> a_wptr;  
    ~B() { std::cout << "B destroyed\n"; }  
};  
  
int main() {  
    std::shared_ptr<A> a_ptr(new A());  
    std::shared_ptr<B> b_ptr(new B());  
  
    a_ptr->b_ptr = b_ptr;  
    b_ptr->a_wptr = a_ptr;  
  
    // 由于使用了weak_ptr,A和B对象都可以被正确删除  
    return 0;  
}

注意:在实际使用中,尽量避免裸指针(raw pointers)和new/delete的直接使用,而是尽可能地使用智能指针来管理内存。

总结:

  1. 熟悉C++11引入的三种智能指针的原理及判断使用场景;
  2. 理解unique_ptr对auto_ptr的替换;
  3. 三种指针都是将一些释放操作自动化实现,也可以自己手写智能指针;
  4. 一张表格分辨四种智能指针:
auto_ptr (已废弃)unique_ptrshared_ptrweak_ptr
所有权独有(但有问题的拷贝语义)独有共享(引用计数)不拥有(观察)
拷贝语义转移所有权(可能导致问题)禁止拷贝,但可以移动引用计数增加不支持
赋值语义转移所有权(可能导致问题)禁止赋值,但可以移动赋值引用计数增加不支持
销毁当auto_ptr对象销毁时,原对象也被销毁当unique_ptr对象销毁时,原对象也被销毁当最后一个shared_ptr对象销毁时,原对象被销毁不负责销毁原对象
循环引用不适用不适用可能导致问题(需要weak_ptr解决)用于解决shared_ptr的循环引用问题
安全性低(已废弃)高(但需注意循环引用)高(作为shared_ptr的补充)
个人觉得比较好的资源推荐

点击这里

  • 56
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

another heaven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值