2015-10-19 66 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