这是我正在调试的函数:
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;
}
答案 0 :(得分:3)
我看到的问题:
global_buffer = mymalloc(size_chunck*sizeof(char)); //3
global_buffer = buffer;
导致内存泄漏。 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;
答案 1 :(得分:1)
您正在将global_buffer重新分配给'缓冲区'这是堆未知的地址。这就是你收到错误的原因。不要对global_buffer进行第二次分配。
此外,您应检查先前的错误,以免意外尝试释放空指针。
答案 2 :(得分: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);