c/c++編譯器對程式佔用的記憶體配置可分為以下幾個部分:
1、棧區(stack):由編譯器自動分配釋放,存放函數的參數值,局部變數的值等。其操作方式類似於資料結構中的棧。
2、堆區(heap):一般由程式員分配釋放,若程式員不釋放,程式結束時可能由OS回收。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鏈表。
3、全域區(靜態區)(static):全域變數和靜態變數的儲存是放在一塊的,初始化的全域變數和靜態變數在一塊地區,未初始化的全域變數和未初始化的靜態變數在相鄰的另一塊地區。程式結束後有系統釋放。
4、文字常量區:常量字串就是放在這裡的。程式結束後由系統釋放。
5、程式碼區:存放函數體的二進位代碼。
在用C/C++編程時,我們跟堆打交道的多,且要特小心啊。對於堆來說,釋放工作由程式員控制,容易產生memory leak。一般使用malloc/calloc -- free;new and delete 來對堆進行操作。一個非常重要的規則就是:開闢的空間一定要在程式結束後把空間釋放掉。因為釋放避免了記憶體流失,又可以檢測到記憶體申請空間太小或對記憶體越界錯誤。
在一次項目中,在init function 中,malloc 了很多空間,然後完成一切相關的操作,且一切正常,結果也正確,但在uninit function中,對空間進行釋放時,就出現在以下錯誤:
DAMAGE: after Normal block (#4826967) at 0x2000E148。
進行相關的debug,問題發現了。
void initialize_input_buffer(
PARAM *in_buffer
)
{
//int i;
in_buffer->voice_flag = 0;
in_buffer->input_len = 128;
in_buffer->num_vad = 0;
if((in_buffer->input = (short *)(calloc((unsigned)128, sizeof(short)))) == NULL)
{
printf("Failed malloc space operate!\n");
}
}
在init中,我申請了128 short空間,但在使用中,由於一些狀態沒控制好的原因,對這個buffer寫了192個short資料,操作過程中,剛好碰到結果正確,但這種情況很危險,這是屬於超界操作。在free時,就出現上面那個錯誤。
在這就寫這一些,與些問題相關有一個文章寫得更加詳細,在此作下連結啊。
http://blog.csdn.net/ablenavy/archive/2008/06/01/2500678.aspx