天天看點

auto_ptr

1、

  int *pi = new int(1024);

  delete pi; // 釋放pi指向的int對象占用的記憶體空間

  pi = 0; // 将pi設定為0,不指向任何東西,為null

  注意:删除0值的指針是安全的,但是沒有任何意義。對于上面的情況,先釋放記憶體,再置為null。順序不能颠倒,如果颠倒了,會導緻記憶體洩漏。

2、在stack上配置設定的記憶體,用完後,系統會自動釋放,調用析構方法。在heap上,通過new配置設定記憶體,必須使用delete,手動釋放記憶體,如果忘記,會導緻記憶體洩漏。如果重複釋放記憶體,會破壞自由存儲區,導緻配置設定在上面的其他對象受到破壞。(stack記錄程式的執行過程,heap存放資料)

3、為了解決上面的問題,使用auto_ptr

4、auto_ptr是一個模版類,對一個類型的指針進行封裝,把delete操作放在析構方法中,由于析構方法總是被調用,就保證了記憶體不會洩露。

5、auto_ptr是一個模版類,為了讓auto_ptr使用起來像一個指針,重載*與->操作符。

6、用a對象copy構造b對象的時候,要把a的指針設為0,為什麼?

  如果,不把a的指針設為0,a,b都會在析構方法中進行delete,導緻重複釋放。

7、把a對象copy指派給b對象的時候,首先要把b對象的指針delete,然後把a的指針設為0,為什麼?

  b的指針指向了a的指針,要對b原來的指針釋放掉,不然記憶體洩漏。

8、copy構造是破壞性操作,lhs的指針指向rhs的資源,rhs的指針設為null。為了避免重複釋放。

9、copy指派是破壞性操作,首先對lhs進行delete,避免記憶體洩漏。其次,lhs的指針指向rhs的資源,rhs的指針設為null。為了避免重複釋放。  

繼續閱讀