記憶體的分配方式和常見出錯方式

2021-06-10 03:12:03 字數 1502 閱讀 2838

1.

記憶體有幾種分配模式

記憶體分配方式有三種:

分配方式

何時分配

何時釋放

怎樣釋放

優缺點 1.

靜態儲存區

程式編譯時

程式結束時

自動釋放

在整個程式週期都存在,但是會一直占用程式資源 2.

棧上分配

函式生成時(進棧時)

函式結束時(岀棧時)

自動釋放

棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。 3.

堆上分配

malloc

和new分配時

free

和delete時

程式設計師手動釋放

生命週期由程式設計師決定,使用方便靈活,但是也問題多

常見的記憶體錯誤

1.記憶體分配未成功,卻使用了它。

2.記憶體分配雖然成功,但是尚未初始化就引用它。

3. 記憶體分配成功並且已經初始化,但操作越過了記憶體的邊界。

4. 忘了釋放記憶體,造成記憶體洩露。

5.釋放了記憶體卻繼續使用它。

對策1.

程式中的物件呼叫關係過於複雜,實在難以搞清楚某個物件究竟是否已經釋放記憶體,此時應該重新設計資料結構,從根本上解決物件管理的混 亂局面。

2. 函式的return語句寫錯,注意不要返回指向「棧記憶體」的「指標」或者」引用「,因為該內存在函式體結束時被自動銷毀。

3.使用free或delete釋放記憶體後,沒有將指標設定為null,導致野指標的產生。

1.返回棧記憶體指標      

char *getstring(void)

char* pget = getstring();

這段程式編譯時沒有錯誤,執行也沒有錯誤,但是你卻無法使得返回的pget指標指向的資料是你想要的「hello world」,因為指標p的生命期是函式getstring內,執行完函式getstring後,p分配的棧空間馬上被系統**了。雖然pget指向了p 當初分配的記憶體位址,但是那塊位址已經沒有內容了。      

2.這是乙個出現頻率非常高的錯誤      

char* pchar = new char;

int a ;

pchar = &a;

delete pchar;

當然這是乙個例子,具體的程式各有不同。      

這段程式有兩個問題。一是pchar = &a;將導致pchar原先分配的空間無法再被獲取,就象我們的丟失了朋友的**號碼一樣,無法再聯絡這個朋友了。這就造成了記憶體洩漏。如果記憶體洩漏多了,可能導致系統的崩潰,因為可用的資源將越來越少,直到枯竭為止。第二個問題是delete pchar將導致異常發生,因為這時的pchar已經不是指向動態分配的記憶體了,而是指向了a分配的棧空間,而棧空間是不能使用delete來**的,因 此將導致記憶體異常。      

記憶體是財富,正確使用財富是關鍵,為人如此,程式設計也如此。

參考文獻: 《高質量c++/c程式設計指南》 (作者: 林銳 博士)

記憶體分配方式

記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的 整個執行期間都存在。例如全域性變數,static 變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函 數執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指...

記憶體分配方式

記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個 執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執 行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令...

記憶體分配方式

乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它與資料結構中的堆是兩回事,分配方...