2015-10-19 48 views
0

這是我的函數,其中我調試:Ç - free()的錯誤

boolean 
adin_memory(char* buffer, int size_chunck, int end_flag){ 
    global_buffer = mymalloc(size_chunck*sizeof(char)); //3 
    global_buffer = buffer; 

    real_data= (SP16 *)mymalloc(size_chunck*sizeof(SP16)); //3 
    memcpy(real_data,global_buffer,size_chunck); 

    free(global_buffer); //ERROR 

    pos_escrita += size_chunck; 

    global_size = size_chunck; 
    global_end_flag = end_flag; 
    return TRUE; 
} 

這是mymalloc功能:

void * 
mymalloc(size_t size) 
{ 
    void *p; 
    if ((p = malloc(size)) == NULL) { 
#if defined(_WIN32) && !defined(__CYGWIN32__) 
    jlog("Error: mymalloc: failed to allocate %Iu bytes\n", size); 
#else 
    jlog("Error: mymalloc: failed to allocate %zu bytes\n", size); 
#endif 
    *((char*)0) = 0 ; //###ARL provoca um exception 
    exit(1); 
    } 
    return p; 
} 

free()函數被調用我得到這個錯誤。爲什麼? enter image description here

+1

@ user3121023這應該是一個答案(和順便說一句,'global_buffer'無處被定義這段代碼似乎確實是一個全局變量......非常奇怪) –

+0

建議根據廣泛使用的約定,調用一個'malloc()'-wrapper檢查OOM xmalloc()。 –

+0

進一步建議不要投射從'malloc()'(或更一般的'void *'指針)返回的指針 –

回答

3

的問題,我看到的。 mymalloc返回的值現在丟失。

real_data= (SP16 *)mymalloc(size_chunck*sizeof(SP16)); //3 
memcpy(real_data,global_buffer,size_chunck); 

free(global_buffer); //ERROR 

這將是一個問題,具體取決於buffer的定義方式。以上語句相當於:

free(buffer); 

很難說爲什麼這是一個錯誤而沒有看到如何調用該函數。如果不理解更大的圖景,很難說明應該改變什麼。更具體地講,目前尚不清楚爲什麼你需要使用:

global_buffer = buffer; 
+0

你說的都是。謝謝 – jdscardoso

+0

@jdscardoso,不客氣。我很高興能夠提供幫助。 –

1

您正在將global_buffer重新分配給'buffer',這是堆未知的地址。這就是爲什麼你得到一個錯誤。不要做第二次分配給global_buffer。

此外,你應該檢查一個較早的錯誤,所以你不會意外地嘗試釋放空指針。

global_buffer = mymalloc(size_chunck*sizeof(char)); //3 
global_buffer = buffer; 

導致內存泄漏:

1

從第一眼看到:

//you allocate memory and store it in global_buffer 
global_buffer = mymalloc(size_chunck*sizeof(char)); //3 

// you overwrite global_buffer by a new value of buffer 
global_buffer = buffer; 

// global_buffer no more hold the address of memory allocated 
// but you still want to free it 
... 
free(global_buffer); 
+0

總之,但是在這點上......謝謝! – jdscardoso