C++以对象管理资源
先看下面一段代码:
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++以对象管理资源的更多相关文章
- Effective C++ ----以对象管理资源
以对象管理资源 通过对象的析构函数的自动调用来自动释放资源 第一部分:几种典型的以对象管理资源的例子 1. STL::auto_ptr 获取资源后立刻放入资源管理对象 std::auto_ptr< ...
- [Effective C++ --013]以对象管理资源
这一节基本讲述的是将资源放进管理对象,防止忘记释放资源. 1.一般New和Delete使用场景 void fun() { SimpleClass* pSimpleClass1 = new Simple ...
- 《Effective C++》学习笔记条款13 以对象管理资源
条款 13 :以对象管理资源 例: voidf() { Investment *pInv = createInvestment(); ... ...
- 以对象管理资源——C++智能指针auto_ptr简介
auto_ptr是C++标准库提供的类模板,它可以帮助程序员自动管理用new表达式动态分配的单个对象.auto_ptr对象被初始化为指向由new表达式创建的对象,当auto_ptr对象的生命期结束时, ...
- Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为
三.资源管理 资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket ...
- effective C++ 读书笔记 条款14 以对象管理资源
如果我们使用一个投资行为的程序库: #include "stdafx.h" #include <iostream> #include <memory> us ...
- EC笔记:第三部分:13、以对象管理资源
C++相比Java等含有gc的语言来说,内存管理方面(也包括资源管理)比较令人头疼.一些初级程序员,甚至是一些经验丰富的老程序员,也会经常在资源管理上犯错.这时候就需要一个能够自动管理资源的东西(gc ...
- Effective C++(13) 用对象管理资源
问题聚焦: 从这条准则开始,都是关于资源管理的. 资源,一旦用了它,将来必须还给系统. 本条准则,基于对象的资源管理办法,建立在C++的构造函数,析构函数和拷贝函数(拷贝构造函数和重载赋值操作符)的基 ...
- Effective C++ -----条款13:以对象管理资源
为防止资源泄漏,请使用RAII(Resource Acquisiton Is Initialization) 对象,它们在构造函数中获得资源并在析构函数中释放资源. 两个常被使用的RAII class ...
随机推荐
- 保利威视Polyv点播集成
demo和文档下载地址http://dev.polyv.net/2014/08/sdk/ 1.demo是eclipse的,所以导入android studio有几个要注意的地方 导入方式 在app的b ...
- Activity之间传递数据的方式及常见问题总结
Activity之间传递数据一般通过以下几种方式实现: 1. 通过intent传递数据 2. 通过Application 3. 使用单例 4. 静态成员变量.(可以考虑 WeakReferences) ...
- 第二篇:JMeter实现接口/性能自动化(JMeter/Ant/Jenkins)
主要是对HTML报告的优化 如果按JMeter默认设置,生成报告如下:
- Android Studio 引入Lambda表达式
依次点击 [File][Other Settings][Default Project Structure]确保当前项目使用的JDK版本是1.8. 打开项目(Project)的build.gradle ...
- Eclipse如何替换android应用图标
打开你的项目 我们看到项目里有 res这个文件夹里有以下文件夹. drawable-hdpi -------高分辨率 drawable-ldpi -------中分辨率 drawab ...
- POJ 1509 最小表示法
题目链接:http://poj.org/problem?id=1509 题意:给定一个字符串,求一个起点使字符串从该起点起的字符串字典序最小[题目的字符串起点从1开始] 思路:最小表示法模板题 #de ...
- 静态函数(面向过程的static关键字)
在函数的返回类型前加上static关键字,函数即被定义为静态函数.静态函数与普通函数不同,它只能在声明它的文件中可见,不能被其他文件使用. 静态函数的例子: #include <iostream ...
- 转载:回编译APK出错:java.nio.char set.MalformedInputException: Input length = 1
使用APKtool回编译APK,出现错误如下: Exception in thread "main" org.yaml.snakeyaml.error.YAMLExcepti ...
- MR并行算法编程过程中遇到问题的思考
1. Reducer 类中 reduce函数外定义的变量是在Reducer机器上属于全局变量的,因此,一台机器上reduce函数均可以对该变量的值做出贡献.如代码:(sum和count数据Reduce ...
- centos 编译 安装 protobuf
link:http://dbua.iteye.com/blog/1633079 yum -y install gcc+ gcc-c++ yum -y install make 下载protobuf-2 ...