c++智能指针

c++智能指针

  1. shared_ptr
  2. unique_ptr
  3. weak_ptr
  4. auto_ptr(被 C++11 弃用)
  • Class shared_ptr 实现共享式拥有(shared ownership)概念。多个智能指针指向相同对象,该对象和其相关资源会在 “最后一个 reference 被销毁” 时被释放。为了在结构较复杂的情景中执行上述工作,标准库提供 weak_ptr、bad_weak_ptr 和 enable_shared_from_this 等辅助类。
  • Class unique_ptr 实现独占式拥有(exclusive ownership)或严格拥有(strict ownership)概念,保证同一时间内只有一个智能指针可以指向该对象。你可以移交拥有权。它对于避免内存泄漏(resource leak)——如 new 后忘记 delete ——特别有用。

shared_ptr

共享式拥有,多个智能指针可以共享同一个对象,对象的最末一个拥有着有责任销毁对象,并清理与该对象相关的所有资源。

  • 支持定制型删除器(custom deleter),可防范 Cross-DLL 问题(对象在动态链接库(DLL)中被 new 创建,却在另一个 DLL 内被 delete 销毁)、自动解除互斥锁
#include <iostream>
#include <memory>
using namespace std;

void Func1(shared_ptr<int> a)
{
    cout << "Enter Func1" << endl;
    cout << "Ref count: " << a.use_count() << endl;
    cout << "Leave Func1" << endl;
}

shared_ptr<int> Func2(shared_ptr<int>& a)
{
    cout << "Enter Func2" << endl;
    cout << "Ref count: " << a.use_count() << endl;
    cout << "Leave Func2" << endl;
    return a;
}

int main()
{
    //构造一个指向int类型对象的指针aObj1,引用计数+1
    shared_ptr<int> aObj1(new int(10));
    cout << "Ref count: " << aObj1.use_count() << endl;

    {
        //同aObj1,不过由于生存周期在括号内,所以aObj2会被销毁
        shared_ptr<int> aObj2 = aObj1;
        cout << "Ref count: " << aObj2.use_count() << endl;//引用计数-1
    }

    //在调用函数时,参数为shared_ptr类型,参数为传引用类型,智能指针引用计数不变
    Func2(aObj1);

    //在调用函数时,参数为shared_ptr类型,参数为传值类型,智能指针引用计数+1,但是离开作用域之后,引用计数-1
    Func1(aObj1);

    //赋值 智能指针引用计数+1
    shared_ptr<int> aObj3 = Func2(aObj1);//引用计数+1
    cout << "Ref count:" << aObj3.use_count() << endl;

    return 0;
}

weak_ptr

weak_ptr 允许你共享但不拥有某对象,一旦最末一个拥有该对象的智能指针失去了所有权,任何 weak_ptr 都会自动成空(empty)。因此,在 default 和 copy 构造函数之外,weak_ptr 只提供 “接受一个 shared_ptr” 的构造函数。

  • 可打破环状引用(cycles of references,两个其实已经没有被使用的对象彼此互指,使之看似还在 “被使用” 的状态)的问题

share_ptr与weak_ptr的区别与联系_蒲公英的记忆的博客-CSDN博客_share_ptr weak_ptr

#include <iostream>
#include <memory>
using namespace std;
 
void Check(weak_ptr<int> &wp)
{
    shared_ptr<int> sp = wp.lock(); // 重新获得shared_ptr对象
    if (sp != nullptr)
    {
        cout << "The value is " << *sp << endl;
    }
    else
    {
        cout << "Pointer is invalid." << endl;
    }
}
 
int main()
{
    shared_ptr<int> sp1(new int(10));
    shared_ptr<int> sp2 = sp1;
    weak_ptr<int> wp = sp1; // 指向sp1所指向的内存,但是不会增加引用计数的次数
 
    cout << *sp1 << endl;
    cout << *sp2 << endl;
    Check(wp);
 
    sp1.reset();//sp1清除,计数减一,但是sp2还有引用计数
    cout << *sp2 << endl;
    Check(wp);
 
    sp2.reset();//清除sp2,计数减一,此时引用计数等于0;
    Check(wp);
 
    system("pause");
    return 0;
}

unique_ptr

unique_ptr 是 C++11 才开始提供的类型,是一种在异常时可以帮助避免资源泄漏的智能指针。采用独占式拥有,意味着可以确保一个对象和其相应的资源同一时间只被一个 pointer 拥有。一旦拥有着被销毁或编程 empty,或开始拥有另一个对象,先前拥有的那个对象就会被销毁,其任何相应资源亦会被释放。

  • unique_ptr 用于取代 auto_ptr

auto_ptr

被 c++11 弃用,原因是缺乏语言特性如 “针对构造和赋值” 的 std::move 语义,以及其他瑕疵。

auto_ptr 与 unique_ptr 比较

  • auto_ptr 可以赋值拷贝,复制拷贝后所有权转移;unqiue_ptr 无拷贝赋值语义,但实现了move 语义;
  • auto_ptr 对象不能管理数组(析构调用 delete),unique_ptr 可以管理数组(析构调用 delete[] );
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ZLOZL

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

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

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

打赏作者

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

抵扣说明:

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

余额充值