C 動態分配後的記憶體釋放

2021-09-26 05:26:49 字數 1805 閱讀 5524

最近在用c++寫專案時遇到的一些動態分配上的易錯點,所以寫這篇部落格來記錄下。下面我會列舉一些問題作為例子來總結一下動態分配的易錯點,如有不對,歡迎指正。

我們經常會在乙個函式中對指標進行動態分配。動態分配伴隨著釋放,不及時釋放分配的記憶體會造成記憶體洩漏,那麼我們應該什麼時候在**釋放已經分配的記憶體呢?

常見的情況是在函式中動態分配了乙個指標,我們在函式作用域結束時釋放該指標,防止記憶體洩漏。下面是乙個在作用域結束後釋放的例子

void

func()

我們在函式 func() 中申請了乙個指標 p,並為它動態分配記憶體空間,我們在函式作用域結束前將分配給它的記憶體釋放掉。

void

func_mutibacks

(int a ,

int b)

delete p;

p =null

;return;}

func_mutibacks(1

,1);

// 函式沒有走到最後,提前返回,指標p沒有釋放,記憶體洩漏

函式 func_mutibacks() 是乙個多出口函式,即擁有多個返回點。func_mutibacks(1, 1) 函式會提前返回,此時指標p沒有釋放,記憶體洩露。

對於有多個出口的函式,我們在return之前釋放指標記憶體,修改後的**如下:

void

func_mutibacks

(int a ,

int b)

delete p;

p =null

;return;}

func_mutibacks(1

,1);

此時指標p正確被釋放,不會造成記憶體洩漏。

通過剛才的兩個例子可以看到,乙個函式在有多個出口的情況下,我們必須對每個出口都加一道「門」,必須在每個return前寫一次釋放。這樣未免也太麻煩了!那有沒有什麼方法可以讓我們不用思考這麼多直接用呢?

我們知道析構函式會在類物件結束時自動呼叫並釋放掉物件的記憶體。所以我們在寫專案的時候,可以將指標放在乙個類中,在析構函式裡釋放申請的指標記憶體。 這樣就不用考慮釋放不及時造成記憶體洩露了。下面是乙個利用析構函式釋放指標記憶體的乙個例子:

// 類cpoint

class

cpoint

;cpoint::

cpoint()

:m_point

(null

)cpoint::

~cpoint()

int* cpoint::

get(

)

void

func_mutibacks

(int a ,

int b)

int c =1;

*(p.

get())

= c;

std::cout <<

*(p.

get())

<< std::endl;

// 輸出1

return;}

func_mutibacks(1

,2);

此時指標 m_point會隨著 物件p 生命週期的結束而自動釋放記憶體,不會出現記憶體洩露的問題。

這只是乙個很簡單的例子,例子中我們也沒用指標做其他事情,所以可能有人會覺得這樣十分麻煩,但如果我們要頻繁的動態分配乙個指標,那還是建議封裝到類裡比較好。

記憶體動態分配與釋放

1 c語言的函式malloc和free 1 函式malloc和free在標頭檔案中的原型及引數 void malloc size t size 動態配置記憶體,大小有size決定,返回值成功時為任意型別指標,失敗時為null。void free void ptr 釋放動態申請的記憶體空間,呼叫fre...

記憶體動態分配與釋放

1 c語言的函式malloc和free 1 函式malloc和free在標頭檔案中的原型及引數 void malloc size t size 動態配置記憶體,大小有size決定,返回值成功時為任意型別指標,失敗時為null。void free void ptr 釋放動態申請的記憶體空間,呼叫fre...

記憶體動態分配與釋放

記憶體的動態分配需要使用函式malloc,函式free和運算子sizeof來實現。函式malloc的原型是 void malloc unsigned int size 函式malloc的作用是在記憶體中分配乙個長度為size的連續儲存空間。函式的返回值是乙個指向分配空間的起始位置的指標。如果分配空間...