Effective C++条款13:以对象管理资源

通常来讲,我们会使用new、delete来直接进行内存的管理。但是,由于很多原因,我们在这样使用的时候会造成内存的泄露。比如:

1、程序员在编程的时候new了一个内存,但是在后面编程的时候忘了进行delete,这样就会造成内存泄漏。

2、例如下列实例代码:

void f() const
{
    Investment* pInv = creatInvestment(); 
    if(xxx)
    {
        return;
    }
    delete a;
}
    

这时,我们单看后面的delete时,我们通常会认为自己符合了动态内存的管理法则,但是,其实在中途的判断语句中,如果有return,那么这时,我们假如忘记调用delete,那就会造成内存泄漏。或者即使,我们都记得写了,但是,如果函数在调用时,抛出了异常,那么,就一样会造成内存泄漏。

甚至,即便我们考虑到了所有的各种情况,但是当后人来修改我们的代码,假如他没有充分理解代码而鲁莽地修改,就有可能发生内存泄漏的情况。

所以为了避免这种情况的发生,我们应该使用对象进行资源管理。

这里最好的方法就是使用智能指针。

下面为使用智能指针避免函数发生潜在的资源泄漏可能性:

void f()
{
    std::auto_ptr<Investment> pInv(createInvestment());
    ...
}
//经由auto_ptr的析构函数自动删除pInv

这个例子体现了“以对象管理资源”的两个关键想法:

1、获得资源后立即放进管理对象

实际上,“以对象管理资源”的观念通常被称为“资源取得时机便是初始化时机”(Resource Acquisition Is Initialization;RAII

2、管理对象运用析构函数确保资源被释放

不论控制流如何离开区块,一旦对象被销毁,其析构函数自然会被自动调用,于是资源被释放。

 

auto_ptr被销毁时会自动删除它所指之物,所以一定要注意别让多个auto_ptr同时指向同一对象。

此外,auto_ptr有一个独特的性质:若通过拷贝构造函数或拷贝赋值操作符复制它们,它们会变成null,而复制所得的指针将取得资源的唯一拥有权。

auto_ptr的独特性使得STL容器的要求无法实现,所以它使用了替代的方法:“引用计数型智慧指针”(reference-counting smart pointerRCSP)。RCSP也是一个智能指针,能够持续跟踪共有多少个对象指向某笔资源,并在无人指向它的时候自动删除该资源。RCSPs提供的行为类似垃圾回收(garbage collection),但是RCSP无法打破环状引用(cycles of references, 例如两个以及无人使用的对象彼此互指,因此好像就处于“被使用”的状态)。

 

要记住的点:

1、为了防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。

2、两个常被使用的RAII 对象分别是:tr1::shared_ptr和auto_ptr。前者通常为较好的选择,因为其拷贝行为比较直观,若选择auto_ptr,复制动作会使他指向nullptr。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值