1. 程式人生 > >淺析C++中的智能指針

淺析C++中的智能指針

ron delete 存在 () 執行 釋放 release let 托管

一. 概述

由於最近比較多的接觸到這塊的代碼,因此有必要做個總結。

眾所周知,C/C++中的堆內存分配和釋放的方式主要是: malloc/free 以及 new/delete 等,但這些方式對程序員要求較高,一不小心很可能就會導致內存泄漏而不自知。

請看下面的代碼:

void func()
{
    T *pt = new T();
    
    ... /* 此處代碼省略若幹行 */
    
    delete pt;
    pt = NULL;
    return;
}

如果 func 函數能順利執行到 delete 處當然是最理想的。如果由於某種原因導致函數在中途返回了

,或者在還沒執行到 delete 語句時發生了異常,那麽就悲劇了,為指針pt分配的內存得不到釋放,產生了一個經典的內存泄漏。如果 func 函數是一個執行頻率較高的函數,那麽就尷尬了...

為了消除傳統的內存分配方式上存在的隱患,C++提供了一些強大的智能指針模版類,其核心思想就是:把指針封裝在一個"智能的"類似於指針的對象裏,這個對象擁有這個指針並且能在析構時自動刪除這個指針所指的內存

二. auto_ptr類

字面意義上看,auto_ptr 就是自動指針的意思,當分配的內存不需要使用了,它可以自動回收。

廢話不多說,先看例子:

void fun2()
{
   T *pt = new
T(); std::auto_ptr apt(pt); // 將分配的堆內存指針交由auto_ptr托管 *apt = 10; // 像正常使用指針一樣使用,相當於*pt= 10 apt->memFunc(); // 相當於 pt->memFunc() T *pt2 = apt.get(); // 使用get函數可獲取它托管的指針 T *pt3 = apt.release(); // 可調用release函數放棄托管 // 放棄托管意味著又需要自己手動釋放內存了 delete pt3; pt3 = NULL;
return; }

未完待續...

淺析C++中的智能指針