Ç - free()的错误
这是我的函数,其中我调试:Ç - 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;
}
的问题,我看到的。 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;
你说的都是。谢谢 – jdscardoso
@jdscardoso,不客气。我很高兴能够提供帮助。 –
您正在将global_buffer重新分配给'buffer',这是堆未知的地址。这就是为什么你得到一个错误。不要做第二次分配给global_buffer。
此外,你应该检查一个较早的错误,所以你不会意外地尝试释放空指针。
global_buffer = mymalloc(size_chunck*sizeof(char)); //3
global_buffer = buffer;
导致内存泄漏:
从第一眼看到:
//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);
总之,但是在这点上......谢谢! – jdscardoso
@ user3121023这应该是一个答案(和顺便说一句,'global_buffer'无处被定义这段代码似乎确实是一个全局变量......非常奇怪) –
建议根据广泛使用的约定,调用一个'malloc()'-wrapper检查OOM xmalloc()。 –
进一步建议不要投射从'malloc()'(或更一般的'void *'指针)返回的指针 –