当前位置:编程学习 > C/C++ >>

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++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,