C - free()错误

时间:2015-10-19 18:47:44

标签: c

这是我正在调试的函数:

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

3 个答案:

答案 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);