条款13:以对象管理资源

首先考虑一个工厂函数

Investment * createInvestment();
void f()
{
    Investment * pInv = createInvestment();
    ...
        delete pInv;
}

至少上面这个函数是不安全的,例如如果...里面包含return语句的话,
或者说...里面包含可能会抛出异常的语句。那么就会导致申请的内存得不到释放。
而下面就说明了管理对象的一般方法:

void f()
{
    std::shared_ptr<Investment>(createInvestment());
    ...
}

用对象来进行管理,这样在离开作用域的时候申请的内存便会自动得到释放。
注意这里包含有两个关键的想法:
1. 获得资源之后应该把他们立刻放到管理对象里面。
2. 管理对象可以利用析构函数使得资源正确的被释放。
注意,shared_ptr等智能指针不能对内置的数组进行管理,因为他们在自己的析构函数里面调用的是

delete而不是delete[], 例如下面这样就是不可取的:
shared_ptr<int> spi(new int[1024]);    //不要这样做
这种情况应该使用vector来代替:
shared_ptr<vector> spi(new vector<int>); //像这样

小结:
1. 为防止资源泄露,应该使用RAII对象,他们在构造函数中获得资源,而在析构函数里面释放资源。
2. auto_ptr不能用在多个指针指向同一个对象的场合。

时间: 2024-10-23 06:08:20

条款13:以对象管理资源的相关文章

13——以对象管理资源

RAII(resource acquisition is initialization):资源获取时便是初始化时机. 不论控制流如何离开执行的区域块,其析构函数被调用,资源被释放. 为防止内存泄露使用auto_ptr或shared_ptr():auto_ptr<class> sp(new class)+shared_ptr<class> sp2(new class) 13--以对象管理资源

effective C++ 读书笔记 条款14 以对象管理资源

如果我们使用一个投资行为的程序库: #include "stdafx.h" #include <iostream> #include <memory> using namespace std; class Investment { public: }; class InvestmentFactory { public: virtual Investment* createInvestment() { Investment * inV = NULL; return

effective c++条款13-17 “以对象管理资源”之RAII浅析

RAII是指C++语言中的一个惯用法(idiom),它是"Resource Acquisition Is Initialization"的首字母缩写.中文可将其翻译为"资源获取就是初始化".虽然从某种程度上说这个名称并没有体现出该惯性法的本质精神,但是作为标准C++资源管理的关键技术,RAII早已在C++社群中深入人心. 使用局部对象管理资源的技术通常称为"资源获取就是初始化".这种通用技术依赖于构造函数和析构函数的性质以及它们与异常处理的交互作

effective c++条款13-17 “以对象管理资源”之auto_ptr源码分析

auto_ptr是当前C++标准库中提供的一种智能指针,诚然,auto_ptr有这样那样的不如人意,以至于程序员必须像使用"裸"指针那样非常小心的使用它才能保证不出错,以至于它甚至无法适用于同是标准库中的那么多的容器和一些算法,但即使如此,我们仍然不能否认这个小小的auto_ptr所蕴含的价值与理念. 这里用了Nicolai M. Josuttis(<<The C++ standard library>>作者)写的一个auto_ptr的版本,并做了少许格式上的修

effective c++条款13-17 “以对象管理资源”之shared_ptr浅析

顾名思义,boost::shared_ptr是可以共享所有权的智能指针,首先让我们通过一个例子看看它的基本用法: #include <string> #include <iostream> #include <boost/shared_ptr.hpp> class implementation { public: ~implementation() { std::cout <<"destroying implementation\n";

effective c++条款13-17 “以对象管理资源”之C++隐式转换和转换构造函数

其实我们已经在C/C++中见到过多次标准类型数据间的转换方式了,这种形式用于在程序中将一种指定的数据转换成另一指定的类型,也即是强制转换,比如:int a = int(1.23),其作用是将1.23转换为整形1.然而对于用户自定义的类类型,编译系统并不知道如何进行转换,所以需要定义专门的函数来告诉编译系统改如何转换,这就是转换构造函数和类型转换函数! 注意:转换构造函数.隐式转换和函数对象不要搞混淆!!!函数对象是重载运算符(),和隐式转换函数易混淆. 一.转换构造函数 转换构造函数(conve

Effective C++ 条款13/14 以对象管理资源 || 在资源管理类中小心拷贝行为

三.资源管理       资源就是一旦你使用了它,将来不用的时候必须归还系统.C++中最常用的资源就是动态内存分配.其实,资源还有 文件描述符.互斥器.图形界面中的字形.画刷.数据库连接.socket等. 1.        以对象管理资源       void f() {     investment *plv = createInvestment();     //这里存在很多不定因素,可能造成下面语句无法执行,这就存在资源泄露的可能.     delete plv; }      这里我们

[013]以对象管理资源

这一节基本讲述的是将资源放进管理对象,防止忘记释放资源. 1.一般New和Delete使用场景 void fun() { SimpleClass* pSimpleClass1 = new SimpleClass; .... // 如果这中间发生异常返回,则delete pSimpleClass1将不会被执行,造成内存泄漏 delete pSimpleClass1; SimpleClass* pSimpleClass2 = createSimpleClass(); .... // 如果这中间发生异

Effective C++读书笔记之十三:以对象管理资源

Item 13:Use objects to manage resources 假设我们使用一个用来塑膜投资行为的程序库,其中各式各样的投资类型继承自一个root class: class Investment { ... };  //"投资类型"继承体系中的root class 进一步假设,这个程序系通过一个工厂函数(工厂函数会"返回一个base class指针,指向新生成的derived class 对象),供应我们某特定的Investment对象: Investment

EC笔记:第三部分:13、以对象管理资源

C++相比Java等含有gc的语言来说,内存管理方面(也包括资源管理)比较令人头疼.一些初级程序员,甚至是一些经验丰富的老程序员,也会经常在资源管理上犯错.这时候就需要一个能够自动管理资源的东西(gc),但是由于C++本身没有提供,那么只有我们自己实现了. 本节我不打算直接按照<Effective C++>本节的内容进行写作,而是手动实现一个智能指针(想想还有些小激动呢^_^). 首先,我们先编写一个测试代码(先写测试代码总是一个好习惯): //test.h #pragma once #inc