2013-04-03 104 views
0

当我尝试释放我的循环缓冲区时,出现断言错误(表达式:crtisvalidheappointer)。这是为什么发生?不能释放内存(断言错误)

相关结构:

的代码
typedef struct quote { 
    unsigned int seconds; 
    double rate; 
} quote; 

typedef struct cbuf { 
    unsigned int max; 
    unsigned int start; 
    unsigned int end; 
    unsigned int size; 
    quote *quotes; 
} cbuf; 

块是mallocs并释放:

#define INITIAL_SIZE 10 
static cbuf cb1 = {INITIAL_SIZE, 0, 0, 0, NULL}; 
cb1.quotes = (quote*)malloc(INITIAL_SIZE * sizeof(quote)); 
if(cb1.quotes == NULL) 
{ 
    printf("Error - memory allocation failed."); 
    exit(1); 
} 

free(&cb1); 
+0

你释放一个局部堆栈变量。 SideNote:在编程时不要强制使用'malloc()'。这是一种坏习惯。 – WhozCraig 2013-04-03 20:02:08

+3

你想'免费(&(cb1.quotes))'因为'cb1.quotes'就是你分配的内存 – maditya 2013-04-03 20:02:27

回答

5
free(&cb1); 

你'试图释放内存在cb1点所在,但

static cbuf cb1 = {INITIAL_SIZE, 0, 0, 0, NULL}; 

,这不是malloc版。

free(cb1.quotes) 

是您需要免费的。

4

你不能释放你还没有分配的:

free(&cb1); 
+0

Right ..我今天编码太长了.. – rcj 2013-04-03 20:03:10

0

,你需要记住的唯一的事情是:你可以自由只有您已在动态情况下的分配

内存,你动态分配的内存为“cb1.quotes”不为CB1 所以你必须免费的cb1.quotes不是cb1。

与问候

霍姆斯