關於記憶體溢位的一些問題

2021-04-13 06:59:09 字數 1451 閱讀 2021

不知道是否理解正確,還請高手多加指點,這是我今天再修改程式的時候碰到的一些問題,在我修改的軟體當中正是通過類似

sum函 數的指標返回值,程式編譯沒有錯誤,在我反覆試驗軟體的功能時候出現了指標錯誤,後來修改了函式,讓其不通過指標返回值,這才得以不出現指標錯誤,但在內 存溢位檢測過程中,發現軟體當中的記憶體溢位問題還是很嚴重,我把其歸結為整個軟體設計時,由於大量使用指標,導致指標混亂,出現不少野指標。

假如有如下函式:

int* sum(int x)

s[ ]=∑

return s;

}單從這乙個函式來說,它是記憶體溢位的,

首先,s

為一指標,這是個棧記憶體變數(

stack

),但是它所指的記憶體為堆記憶體空間

(heap)

,因為是以

new來申請的。當函式返回乙個數和的時候,也即函式執行結束的時候,棧記憶體變數

s被系統收回,而

s所申請的堆記憶體空間卻沒有被釋放,因此產生了記憶體溢位。

但是很多時候,我們是要呼叫這樣乙個類似的函式,這個時候,其記憶體是否溢位,則要看具體呼叫的情況。例如:

假設乙個變數 

int* isum;

isum=null;

isum=sum(100);

………………

……………

……………..

delete isum

;isum=null

;則不屬於記憶體溢位,因為

isum

為一指標,當其呼叫函式sum時,其指向的是在sum函式中申請了但沒有被釋放的堆記憶體,而在函式外面,其被

isum

指標所釋放。

若: int* isum

=new int[2];

isum=sum(100);

………………

……………

……………..

delete isum

;isum=null

;還是會記憶體溢位的,我是這樣理解的,因為開始時

isum

已經申請了一片堆記憶體空間,即

isum

已經指向了函式

sum外部的那個堆空間,當呼叫函式的時候,

isum

指標立即指向了函式內部申請的堆空間,因此最後指標

isum

所釋放的是函式

sum內部申請的堆空間,而其在函式外部申請的堆空間沒有被釋放,同樣產生了記憶體溢位。

關於記憶體溢位的問題,我覺得,只要不出現軟體執行時的錯誤就沒有大問題,前提是:

1.軟體執行時間不長。

在軟體結束的時候,作業系統會自動地收回那些沒有被釋放的堆記憶體空間。

2.硬碟空間足夠大。 因為

32位作業系統支援「虛存」,記憶體用完了,自動用硬碟空間頂替

[1][1]林銳

《高質量

c++/c

程式設計指南》

[2]網路文章

c 中關於記憶體的一些問題

void getmemory char p void test void 請問執行test函式會有什麼樣的結果?答 程式崩潰。因為getmemory並不能傳遞動態記憶體,test函式中的str一直都是null。strcpy str,helloworld 將使程式崩潰。解析 該函式中的p是乙個臨時的指...

關於c 中記憶體對齊的一些問題

假設有以下 include include class a class b int main 原始碼檔案為test.cpp,在64位機器上編譯執行 g test.cpp o test test int是4個位元組,short2個位元組,char1個位元組,理論上a因該是4 2 2 1 11個位元組啊...

關於面試的一些問題

面試過程中,面試官會向應聘者發問,而應聘者的回答將成為面試官考慮是否接受他的重要依據。對應聘者而言,了解這些問題背後的 貓膩 至關重要。本文對面試中經常出現的一些典型問題進行了整理,並給出相應的回答思路和參 讀者無需過分關注分析的細節,關鍵是要從這些分析中 悟 出面試的規律及回答問題的思維方式,達到...