TCPL C++资源管理简述

The C++ Programming Language

第五章5.2总结

资源管理对于大型程序来说非常重要。内存泄漏轻则导致性能下降,严重则会引起程序崩溃等问题。

C++的机制主要是constructor/destructor;

下面是一个标准库lock类的用法:

mutex m; // used to protect access to shared data
// ...
void f()
{
unique_lock<mutex> lck {m}; // acquire the mutex m
// ... manipulate shared data ...
}

相当于一个系统原理里面的互斥访问的机制。这里lck需要取得mutex类的m才能进行下面的运算,然后当f()函数介绍的时候,会自动释放mutex。相当于让出访问权给其他可能需要访问的程序。

#include<memory>中有两个“smart pointers”,之所以叫聪明是因为他们有自动管理资源的功能。
[1] unique_ptr 只能有一个拥有者
[2] shared_ptr 可以共享多个拥有者,用counter计数的方法,计算有多少个用户或程序共享改指针。

例如:

void f(int i, int j) // X* vs. unique_ptr<X>;X代表一种类型,如int,double
{
X∗ p = new X; // allocate a new X
unique_ptr<X> sp {new X}; // 创建一个unique_ptr
if (i<99) throw Z{}; // may throw an exception,如果执行该句的话,那么就无法正常释放p指针了
if (j<77) return; // may retur n "early",同样道理,无妨执行下面的语句:delete p
p−>do_something(); // may throw an exception
sp−>do_something(); // may throw an exception
// ...
delete p; // destroy *p
}

这里使用unique_ptr<X> sp{new X}的话可以保证,内存正常释放。

根据C++之父Bejarne的建议是尽量不要用或少用new,delete。

而unique_ptr是个轻量级的机制,相对普通指针,它消耗的空间和时间都差不多。

unique_ptr<X> make_X(int i)
// make an X and immediately give it to a unique_ptr
{
// ... check i, etc. ...
return unique_ptr<X>{new X{i}};
}

shared_ptr和unique_ptr差不多,不过,shared_ptr赋值的时候是copied复制过去,而不是moved移动了。
The shared_ptr is similar to unique_ptr except that shared_ptrs are copied rather than moved.
一个对象的shared_ptr指针的所有权可以共享的,只有最后一个共享者退出的时候,才会destroyed。

它保留一个counting的机制,记录有多少共享者。

什么时候应该用这些指针呢?
1 当我们共享一个对象的时候,我们需要指针去指向这些共享对象使用shared_ptr.

2. 当我们引用多态对象时,我们需要指针或者引用去访问对象。

3. 共享多态对象一般都需要shared_ptr

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值