不知道是否理解正確,還請高手多加指點,這是我今天再修改程式的時候碰到的一些問題,在我修改的軟體當中正是通過類似
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個位元組啊...
關於面試的一些問題
面試過程中,面試官會向應聘者發問,而應聘者的回答將成為面試官考慮是否接受他的重要依據。對應聘者而言,了解這些問題背後的 貓膩 至關重要。本文對面試中經常出現的一些典型問題進行了整理,並給出相應的回答思路和參 讀者無需過分關注分析的細節,關鍵是要從這些分析中 悟 出面試的規律及回答問題的思維方式,達到...