【C++11】Smart Pointer 智能指针 shared_ptr

在C++里,我们用new delete 两个操作符管理动态内存,new出的对象内存在堆上。

一旦我们忘记释放动态内存会导致内存泄漏,智能指针可以很好的避免这个问题。

 

shared_ptr :允许多个指针指向同一个对象

shared_ptr<int> p1; // 定义一个指向int的智能指针
shared_ptr<list<int>> p1; // 定义一个指向lits<int>的智能指针
shared_ptr<int> p2(new int(42)); // 定义一个指向值为42的int类型的智能指针
auto p1 = make_shared<int>(9); // 指向int的指针有一个
auto p2(p1); // p1 p2指向同一个对象,指向int的指针有两个

// if p1 is not null, check whether it's the empty
if (p1 && p1->empty())
{
    *p1 = 77777777; // 致敬颗粒尔辣舞
}

当最后一个shared_ptr指向object的指针被销毁,shared_ptr类会自动销毁它指向的对象并且释放内存。

智能指针的计数

当我们复制或分配shared_ptr, 每个shared_ptr 会追踪多少个其他shared_ptr指向同一个对象。

p.get() 指向*p的个数

swap(p1,p2); p1.swap(p2); 交换两个指针指向的对象

auto p1 = shared_ptr<int>(9); // p1 count 1
auto p2 = shared_ptr<int>(7); // p2 count 1
p2 = p1; // p1 count 2, p2 count 0, object freed automatically

make_shared : 在动态内存分配并初始化一个对象,并返回指向对象的指针shared_ptr

shared_ptr<int> p1 = make_shared<int>(42); // 创建int指针,值为42
shared_ptr<string> p2 = make_shared<string>(10, '9'); // 创建string指针,值为9999999999
shared_ptr<int> p3 = make_shared<int>(); // 创建int指针,值为0(默认初始化)
auto p4 = make_shared<vector<string>>(); // p4指向vector<string>,值为空

unique_ptr :单独拥有它指向的对象

unique_ptr独占它指向的对象,不支持拷贝、赋值操作。

unique_ptr<double> p1;
unique_ptr<int> p2(new int(42));

unique_ptr<int> p3(p2);  // error: no copy
auto p4 = p2;            // error: no assign

 

参考文献:

C++ Primer 第五版 P450 Dynamic Memory and Smart Pointers

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值