首页 > 代码库 > 【leetcode】sort list

【leetcode】sort list

(一)

先看下面这段看起来貌似很不错的代码:

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。