您的位置:首页 > 编程语言 > C语言/C++

C++的对象管理资源的思想

2013-05-13 10:24 381 查看
请先看下面的代码:

class Investment { ... };

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


其中Investment是作为多态用途的基类,函数f中通过一个工厂函数创建了一个对象,使用结束后通过delete释放资源。这里需要注意的问题是如果f中的程序无法正常执行到pInv,例如提前return,抛出异常等,那么pInv所指向的资源就不能被正确释放,且该对象所保存的资源也不能被释放,因而可能会造成很严重的资源泄漏。

为了解决上面这个问题,可以将资源放入对象,利用C++的“析构函数自动调用”机制,在控制流离开f时,对象就会自动调用析构函数释放那些资源。

1)智能指针

C++中的智能指针是一个“类指针对象”,它在离开作用域时,会自动调用自身的析构函数释放资源。如:

void f()
{
std::auto_ptr<Investment> pInv(createInvestment());
}


上面的代码中在f中声明一个智能指针,它实质上是一个对象,在离开作用域时,会自动调用自身的析构函数删除掉pInv,因而避免了内存泄漏。

2)对象管理资源

用对象管理资源的思想主要是基于C++的"析构函数自动调用"机制,通常它在资源取得之时就用它来初始化或赋值给某个对象,即每一笔资源在取得的时候就将它放在管理的对象中。

3)计数型智能指针

用上面的智能指针管理资源时,不能有多个智能指针指向该资源,因为删除其中一个,那么另外的指针就指向一个空的对象,删除时,编译器会报"未定义行为"错误。因而,在C++中有如下规定:受智能指针对象管理的资源必须不能有一个以上的智能指针同时指向该资源,这样一来,如果对智能指针执行copy或者assign赋值操作,那么新的指针会指向原来的资源,但旧的指针则会变成null:

std::auto_ptr<Investment> pInv(createInvestment());
std::auto_ptr<Investment> pInv1(pInv); //pInv设为null,pInv1指向对象
pInv = pInv1; //pInv1设为null,pInv1向对象


解决该问题的一个基本思路是使用类似垃圾回收的计数型智能指针,它持续追踪有多少个对象指向某一笔资源,在无指针指向它时将其释放掉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: