Effective C++(13) 用对象管理资源
从这条准则开始,都是关于资源管理的。
资源,一旦用了它,将来必须还给系统。
本条准则,基于对象的资源管理办法,建立在C++的构造函数,析构函数和拷贝函数(拷贝构造函数和重载赋值操作符)的基础上。
Demo: root class Investment:
class Investment { ... };
// 工厂函数
Investment* createInvestment(); // 返回指向一个Investment或者其子类的对象,调用者有责任删除它
// 考虑如下调用
void f()
{
Investment* pInv = createInvestment();
......
delete pInv; // 释放pInv所指的对象
}
问题:
当在delete语句调用之前出现return语句或者抛出异常并且该异常被默默地忽略掉时,这个对象便无法被释放。
解决思路:
C++的析构函数自动调用机制
方案一:类指针对象
标准程序库提供的 auto_ptr 是个“类指针对象”,也就是所谓的智能指针,其析构函数自动对所指对象调用delete。
void f()
{
std::auto_ptr<Investment> pInv(createInvestment(( ));
......
}
获得资源后立刻放进管理对象:资源取得时机便是初始化时机管理对象运用析构函数确保资源被释放:一旦对象被销毁(例如当对象离开作用域),其析构函数自然会被自动调用,于是资源被释放。
为了防止多个auto_ptr同时指向同一对象,auto_ptr有一个不同寻常的性质:若通过拷贝构造函数或重载赋值操作符复制它们,原指针会变成null,而复制所得的指针将取得资源的唯一拥有权。
void f()
{
std::auto_ptr<Investment> pInv(createInvestment(( ));
......
}
void f()
{
...
std::str1::shared_ptr<Investment> pInv(createInvestment());
...
}
void f()
{
......
std::tr1::shared_ptr<Investment> pInv1(createInvestment());
std::str1::shared_ptr<Investment> pInv2(pInv1); // pInv1和pInv2指向同一对象
pInv1 = pInv2;
}
std::auto_ptr<std::string> aps(new std::string[10]);
std::str1::shared_ptr<int> spi(new int[1024]);
为了防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源两个常被使用的RAIIclasses分别是tr1::shared_ptr和auto_ptr,前者通常是较佳选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它指向Null。
Effective C++(13) 用对象管理资源的更多相关文章
- 《Effective C++》学习笔记条款13 以对象管理资源
条款 13 :以对象管理资源 例: voidf() { Investment *pInv = createInvestment(); ... ...
- [Effective C++ --013]以对象管理资源
这一节基本讲述的是将资源放进管理对象,防止忘记释放资源. 1.一般New和Delete使用场景 void fun() { SimpleClass* pSimpleClass1 = new Simple ...
- Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为
三.资源管理 资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket ...
- Effective C++ ----以对象管理资源
以对象管理资源 通过对象的析构函数的自动调用来自动释放资源 第一部分:几种典型的以对象管理资源的例子 1. STL::auto_ptr 获取资源后立刻放入资源管理对象 std::auto_ptr< ...
- effective C++ 读书笔记 条款14 以对象管理资源
如果我们使用一个投资行为的程序库: #include "stdafx.h" #include <iostream> #include <memory> us ...
- 以对象管理资源——C++智能指针auto_ptr简介
auto_ptr是C++标准库提供的类模板,它可以帮助程序员自动管理用new表达式动态分配的单个对象.auto_ptr对象被初始化为指向由new表达式创建的对象,当auto_ptr对象的生命期结束时, ...
- EC笔记:第三部分:13、以对象管理资源
C++相比Java等含有gc的语言来说,内存管理方面(也包括资源管理)比较令人头疼.一些初级程序员,甚至是一些经验丰富的老程序员,也会经常在资源管理上犯错.这时候就需要一个能够自动管理资源的东西(gc ...
- Effective C++ -----条款13:以对象管理资源
为防止资源泄漏,请使用RAII(Resource Acquisiton Is Initialization) 对象,它们在构造函数中获得资源并在析构函数中释放资源. 两个常被使用的RAII class ...
- 条款13:以对象管理资源(use objects to manage resources)
NOTE: 1.为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源. 2.两个常被使用的RAII classes 分别是 trl::shared_ptr 和 auto_ ...
随机推荐
- SPOJ 375 树链剖分
SPOJ太慢了,SPOJ太慢了, 题意:给定n(n<=10000)个节点的树,每条边有边权,有两种操作:1.修改某条变的边权:2.查询u,v之间路径上的最大边权. 分析:树链剖分入门题,看这里: ...
- JavaScript阻止事件冒泡(兼容IE、Chrome、FF)
这里仅仅是一个简单代码demo,因为时间问题并未做深入研究,因为今天做项目时要用到阻止事件冒泡的内容,找了好多才找到一个可以使用的,特记录之. <!DOCTYPE HTML> <ht ...
- Matlab与.NET混合编程解决人脸识别问题
原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ht ...
- Python - 缩写(capwords) 和 创建转换表(maketrans) 详细说明
缩写(capwords) 和 创建转换表(maketrans) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27051 ...
- Jquery基础教程第二版学习记录
本文仅为个人jquery基础的学习,简单的记录以备忘. 在线手册:http://www.php100.com/manual/jquery/第一章:jquery入门基础jquery知识:jquery能做 ...
- 使用ExpandableListView时间轴效果达到
不废话,首先在地图上,查看结果 这是用ExpandableListView来实现时间轴效果,原理比較简单,以月份为第一级,以天为第二级来实现的. package com.hj.main; import ...
- 网络资源(3) - iBatis视频
2018_08_24 http://v.youku.com/v_show/id_XMjk2ODY2OTE2.html iBatis视频教程01
- .net Framework各个版本之间的发展
原文:.net Framework各个版本之间的发展 上个星期看到了.NET 4.0框架退休日期逐渐临近文章,发现自己一直在使用NET FrameWork,身为一个NET程序员,里面大概的区别自己还 ...
- android进度条
android进度条 1.达到的效果 2.布局代码 先写一个my_browser.xml文件 存放WebView <?xml version="1.0" encoding=& ...
- Jquery--仿制360右下角弹出窗口
原文:Jquery--仿制360右下角弹出窗口 先发浏览器效果图,给大家看. 要实现这样的效果,按照思路,第一步,写好CSS布局,将图片放到浏览器右下角的位置 CSS代码很灵活,我写的只是简单的一种而 ...