C 11 理解智慧型指標實現原理( 記憶體洩漏)

2021-10-24 02:37:05 字數 3225 閱讀 4459

2. 智慧型指標的原理

3. 智慧型指標的使用

智慧型指標是為了解決記憶體洩漏的問題。

在c語言中,我們用malloc申請記憶體,free釋放記憶體;在c++中,既可以使用上述,對於自定義型別常常會用new申請,delete釋放。一旦申請,忘了釋放,就會導致記憶體洩漏。

即便有的時候,delete了,但是由於中間某些操作會異常,導致無法delete,也會造成記憶體洩漏。

所以引入了智慧型指標,能最大程度避免記憶體洩漏又能兼顧效率。

是由於疏忽或錯誤導致程式未能釋放已經不再使用的記憶體的情況。並不是指內存在物理上的消失,而是在應用程式分配某段記憶體後,因為設計錯誤,而失去了對該段記憶體的控制,因而造成了記憶體洩漏。

長期執行的程式出現記憶體洩漏,如作業系統、後台服務等,會導致響應越來越慢,最終卡死。

堆記憶體洩漏(heap leak)

堆記憶體洩漏指的是通過malloc / calloc / realloc / new 等從堆中分配的一塊記憶體,在使用完成以後,沒有使用free / delete 刪除。假設因為程式的設計錯誤導致這塊記憶體沒有被刪掉,就會導致以後無法使用,就會造成堆記憶體洩漏。

系統資源洩漏

指程式使用系統分配的資源,如套接字、檔案描述符、管道沒有使用對應的函式釋放,導致系統資源的浪費,嚴重可導致系統效能減少,系統執行不穩定。

良好的編碼規範,動態申請的記憶體記著要去釋放。

採用rall思想或者使用智慧型指標來管理資源。

出問題了使用記憶體洩漏檢測工具。

記憶體洩漏(momory leak):

是指程式在申請新的記憶體空間後,沒有釋放已經申請的記憶體空間,後果也許會造成記憶體溢位。

記憶體溢位(out of memory):

指程式申請記憶體時,沒有足夠的記憶體提供給申請者。記憶體不夠用。

二者的關係

記憶體溢位的原因及解決原因

智慧型指標的作用:可以幫助我們避免在申請記憶體空間後忘記釋放造成記憶體洩漏的問題。因為智慧型指標本身是乙個類,當出了類的作用域,類會呼叫析構函式進行釋放資源。所以智慧型指標的作用原理就是在函式結束時自動釋放記憶體空間。

(resource acquisition is initialization)資源獲取即初始化。

在類的建構函式中申請資源並使用,最後在析構函式中釋放資源。

// 使用raii思想設計的smartptr類

template<

class

t>

class

smartptr

~smartptr()

private:t

* _ptr;};

void

mergesort

(int* a, int n)

int main()

;mergesort

(a,5);

}catch

(const exception& e)

return0;

}

上述的smartptr還不能將其成為智慧型指標,因為還不具備指標的行為。指標可以解引用,也可以通過 -> 去訪問所知空間的內容。所以需要對* 、-> 進行過載。

template<

class

t>

class

smartptr

~smartptr()

t& operator*()

t* operator-

>()

private:t

* _ptr;};

struct date

;int main()

總結原理

raii特性 + 過載operator* 和 operator -> ,具有像指標一樣的行為。

包含標頭檔案:

#include < memory>

這裡的指標主要指的是shared_ptr,是一種引用計數型智慧型指標。可以記錄記憶體中有多少個智慧型指標被引用,新增乙個引用計數+ 1,過期乙個引用計數 - 1,當引用計數為 0 的時候 , 智慧型指標才會釋放資源。

通過引用計數的方式實現多個shared_ptr物件之間的共享資源。

#include 

#include

using namespace std;

classa~

a()void

print()

private

: int _ncount;};

int main()

迴圈引用計數:兩個智慧型指標互相指向對方,造成記憶體洩漏。需要weak_ptr,將其中的乙個指標設定為weak_ptr。

因為weak_ptr沒有共享資源,它的建構函式不會引起智慧型指標引用計數的變化。

#include

#include

template>

class

smartpointer

else

}smartpointer

(const smartpointer &ptr)

} smartpointer& opreater =

(const smartpointer &ptr)if(

this

->_ptr)

}this

->_ptr = ptr._ptr;

this

->_count = ptr._count;++(

*this

->_count)

;return

*this;}

t& operator*()

t& operator-

>()

~smartpointer()

} size_t use_count()

};int main()

unique_ptr

獨佔式智慧型指標,不允許拷貝複製,不允許拷貝構造

是執行緒安全的。由於只是在當前**塊範圍內生效, 因此不涉及執行緒安全問題

weak_ptr

弱引用指標,用於觀察shared_ptr或weak_ptr。用於解決迴圈引用計數。

因為weak_ptr沒有共享資源,它的建構函式不會引起智慧型指標引用計數的變化。

C 11智慧型指標

本文介紹c 的四種智慧型指標,其中後三種是c 11新增加的,auto ptr已被棄用。要編譯c 11,需要安裝g 4.8 sudo add apt repository ppa ubuntu toolchain r test sudo apt get update sudo apt get inst...

c 11 智慧型指標

如果在程式中使用new從堆 自由儲存區 分配記憶體,等到不需要時,應使用delete將其釋放。c 引入了智慧型指標auto ptr,以幫助自動完成這個過程。c 11摒棄了auto ptr,並新增了三種智慧型指標 unique ptr,shared ptr,weak ptr。一.auto ptr,un...

c 11 智慧型指標

首先來看shared ptr,先貼一小部分vs2013裡的實現 template class shared ptr template class shared ptr public ptr base ty template explicit shared ptr ux px template cla...