我們知道,使用c++智慧型指標,可以省去我們在申請記憶體後需要釋放對應記憶體的操作。比如,定義乙個int型的shared_ptr並申請一塊記憶體shared_ptr(int) pint(new int),如果給pint重新賦值,或者出pint的作用域,那麼,pint原來指向的記憶體會自動釋放,而不需要我們呼叫delete操作符做釋放操作。
不過,上述便利的前提是,申請的記憶體是基本資料型別,或者定義了析構函式並在析構函式中釋放相關資源的類型別或結構體型別。除此,一些例外情況我們在運用智慧型指標時需要注意。某些第三方庫,申請相關資源後,需要用其專用的api釋放記憶體。
下面的例子是正規表示式的api運用於c++中。new操作符申請資源後,需要用regfree釋放記憶體,否則會出現記憶體洩漏。測試**如下:
#include
#include
#include
#include
#include
#include
#include
using
namespace boost;
using
namespace std;
intmain
(int argc,
char
* ar**)
usleep(10
*1000);
}
status =
regexec
(spregx.
get(
), buf, nmatch, pmatch,0)
;if(status == reg_nomatch)
printf
("no match\n");
elseif(
0== status)
regfree
(spregx.
get())
;while(1
)return0;
}
上述測試程式執行結構如下:
上述測試**定義了regex_t型別的智慧型指標,目的是想實現自動釋放記憶體,但是由於沒有呼叫regfree,目的沒有達到。觀察結果的虛擬記憶體(vsz)和物理記憶體(rss),都出現了顯著增長,說明出現了記憶體洩漏。
如果要使用智慧型指標實現記憶體自動釋放,可以對regex_t進行重新封裝,將regex_t封裝成類或者結構體。在類或結構體中定義析構函式,在析構函式呼叫regfree api實現記憶體的釋放。如可以利用以下結構體替代上面測試**的regex_t。
typedef
struct regexmap_t
else}~
regexmap_t()
}}regexmap_t;
上面是智慧型指標在regex應用的乙個例子,對於需要使用專用api釋放記憶體的其他情形,也需要採取類似的措施。 共享型智慧型指標的實現share pointer
智慧型指標是乙個類,它產生的是乙個類物件,而不是乙個原生的指標物件,但是為了減少類物件與針對物件使用的差異性,所以share ptr類故意過載了兩種常見的指標操作符 和 從而share ptr與普通指標使用方式一樣。簡言之,就是share ptr生成的乙個包含型別指標容器物件,它封裝了指標物件,對指...
C 智慧型指標會引起異常的幾種情況
1,當兩個物件相互使用shared ptr成員變數指向對方,會造成迴圈引用,引用計數失效,從而導致記憶體洩露。解決方式 使用weak ptr弱指標,從而不會修改引用計數的值,其類似乙個普通指標,但不指向引用計數的共享記憶體,但是其可以檢測到所管理的物件是否已經被釋放,從而避免野指標非法訪問。2,不使...
智慧型指標(二)智慧型指標的方法和構造
預設構造shared ptrsp和unique ptrup 指標構造shared ptrsp t 和unique ptrup t 這裡預設為explicit 帶刪除器的構造shared ptrp q,d q這裡可以內建指標和智慧型指標,同時將用d析構器代替delete。所以定義了這麼乙個帶刪除器的建...