2013-04-03 69 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。

與問候

霍姆斯