C++以对象管理资源
2014-03-19 21:42
246 查看
先看下面一段代码:
这样释放资源(delete)做法是正确的。
但是,我们怎么能保证其他人在利用这个代码时在delete之前会不会使用continue语句或者return语句跳过delete,这样一来的话不就无法释放资源浪费资源了吗。
有什么办法呢?即在程序结束之前一定会自动释放资源。
auto_ptr(智能指针):其析构函数自动对其所指的函数调用delete。
它还有另外一个性质:即通过copy构造函数或者copy assignment函数对他们进行复制操作时,它们会变成null,而复制所得的指针将拥有对资源的唯一支配权。
通过上面的例子藐视auto_ptr智能指针的弊端已经显露出来了,即无法行使正常的复制行为。
怎么办?看下面。
tr1::shared_ptr(引用计数智慧指针):它不仅拥有auto_ptr智能指针的功能,最重要的是它还能进行复制行为。
记住:
1、为防止资源泄露,请使用RAII对象。它们在构造函数过程中获得资源,并在析构函数过程中释放资源。
2、两个常用的RAII classes分别是auto_ptr,tr1::shared_ptr,后者更佳。
class Node {}; Node* CreateNode() { } void Solve() { Node *p=CreateNode(); //调用CreateNode函数 ... delete p; //释放资源 }
这样释放资源(delete)做法是正确的。
但是,我们怎么能保证其他人在利用这个代码时在delete之前会不会使用continue语句或者return语句跳过delete,这样一来的话不就无法释放资源浪费资源了吗。
有什么办法呢?即在程序结束之前一定会自动释放资源。
auto_ptr(智能指针):其析构函数自动对其所指的函数调用delete。
void Solve() { std::auto_prt<Node>p(CreateNode()); ... ///经由auto_ptr析构函数自动删除p对象 }
它还有另外一个性质:即通过copy构造函数或者copy assignment函数对他们进行复制操作时,它们会变成null,而复制所得的指针将拥有对资源的唯一支配权。
void Solve() { std::auto_prt<Node>p1(CreateNode()); std::auto_prt<Node>p2(p1); //p2指向对象,p1为null p1=p2; //p1指向对象,p2为null }
通过上面的例子藐视auto_ptr智能指针的弊端已经显露出来了,即无法行使正常的复制行为。
怎么办?看下面。
tr1::shared_ptr(引用计数智慧指针):它不仅拥有auto_ptr智能指针的功能,最重要的是它还能进行复制行为。
void Solve() { std::tr1::shared_ptr<Node>p1(CreateNode()); std::tr1::shared_ptr<Node>p2(p1); //p1和p2指向同一对象 p1=p2; //p1和p2指向同一对象 ... //p1,p2同时被销毁,它们所指的对象也被自动销毁 }
记住:
1、为防止资源泄露,请使用RAII对象。它们在构造函数过程中获得资源,并在析构函数过程中释放资源。
2、两个常用的RAII classes分别是auto_ptr,tr1::shared_ptr,后者更佳。
相关文章推荐
- C++的对象管理资源的思想
- C++ 以对象管理资源
- 必须要注意的 C++ 动态内存资源管理(一)——视资源为对象
- 读书笔记 effective c++ Item 13 用对象来管理资源
- C++ 以对象管理资源
- 【C++箴言:使用对象管理资源】
- C++中以对象管理资源<auto_ptr>(13)---《Effective C++》
- C++ 对象资源管理惯用法
- [置顶] 从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr<class>、实现Ptr_vector .
- Effective C++ Item 13 以对象管理资源
- Effective C++ rule 14 在资源管理对象中处理好copy行为
- C++资源管理----------以对象管理资源
- C++以对象管理资源
- 以对象管理资源——C++智能指针auto_ptr简介
- effective c++ item13:使用对象管理资源
- Effective C++ rule 13 用对象管理资源
- C++箴言<13>:使用对象管理资源
- C++箴言:使用对象管理资源
- 精通C++资源管理-以对象管理资源
- <Effective C++> (Item 13-15): 以对象管理资源