TCPL C++资源管理简述
The C++ Programming Language
第五章5.2总结
资源管理对于大型程序来说非常重要。内存泄漏轻则导致性能下降,严重则会引起程序崩溃等问题。
C++的机制主要是constructor/destructor;
下面是一个标准库lock类的用法:
[cpp]
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计数的方法,计算有多少个用户或程序共享改指针。
例如:
[cpp]
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是个轻量级的机制,相对普通指针,它消耗的空间和时间都差不多。
[cpp]
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
补充:软件开发 , C++ ,