标签:style class blog code color 使用
(一)
先看下面这段看起来貌似很不错的代码:
class Investment {...}; Investment* createInevstment(); //factory函数 void f() { Investment* pInv = createInvestment(); ...; delete pInv; //释放pInv所指的对象 }
但是存在不安全。因为:delete pInv;这条语句不一定能够执行,因为如果在它之前有return语句或者在它前面发生异常等情况的时候,这样的话,控制流就不可能经过这条语句,所以这样的话就会导致资源泄漏!
解决办法:为确保createInevstment返回的资源总是被释放,我们需要将资源放进对象内,当控制流离开函数f的时候,该对象的析构函数会自动释放那些资源。把资源放进对象,我们便可依赖C++的“析构函数自动调用机制”确保资源被释放。
智能指针:auto_ptr是个“类指针对象”,其析构函数自动对其所指对象调用delete。
<span style="color:#000000;">class Investment {...}; Investment* createInevstment(); //factory函数 void f() { auto_ptr<Investment> pInv(createInvestment()); ...; } //经由auto_ptr的析构函数自动删除pInv</span>
(1)createInvestment()以资源取得时机便是初始化时机,每一笔资源在获得的同时立刻被放进管理对象中。
(2)无论控制流如何离开区块,一旦对象被销毁,其析构函数自然会被调用,于是资源就被释放。
(二)
auto_ptr有个性质:若通过copy构造函数或copy assignment操作符复制它们(auto_ptr对象),它们会变成null,而复制所得的指针将取得资源的唯一拥有权。
<span style="color:#000000;">auto_ptr<Investment> pInv1(createInvestment()); auto_ptr<Investment> pInv2(pInv1); //现在pInv2指向对象,pInv1被设为null pInv1 = pInv2; //现在pInv1指向对象,pInv2被设为null</span>
这个诡异的复制行为,使得要求其元素发挥“正常的”复制行为的像STL容器这种容不得auto_ptr。
所以解决方法是用“引用计数型智慧指针”。tr1::shared_ptr
(三)
“引用计数型智慧指针”。tr1::shared_ptr。他也是个智能指针,持续追踪共有多少个对象指向某笔资源,并在无人指向它时自动删除该资源。
<span style="color:#000000;">void f() { tr1::shared_ptr<Investment> pInv(createInvestment()); ... }//经由shared_ptr的析构函数自动删除pInv</span>
这段代码跟auto_ptr的看起来相同,但是shared_ptr的复制行为看起来正常多了:
<span style="color:#000000;">void f() { tr1::shared_ptr<Investment> pInv1(createInvestment()); tr1::shared_ptr<Investment> pInv2(pInv1);//pInv1和pInv2指向同一个对象 pInv1 = pInv2; //同上,无任何改变 ... }//pInv1和pInv2被销毁,他们指向的对象也就被销毁。</span>
(四)
auto_ptr跟shared_ptr的底层实现都是delete而不是delete [];所以不要把他们用在动态分配的array上!
vector跟string几乎总是可以取代动态分配而得的数组!
请记住:
(1)为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源。
(2)两个常被使用的RAII classes分别是auto_ptr和tr1::shared_ptr。后者通常是较佳选择,因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向null。
【leetcode】sort list,布布扣,bubuko.com
标签:style class blog code color 使用
原文地址:http://blog.csdn.net/shiquxinkong/article/details/29839645