2010-12-09 52 views
1

我有點困惑。使用免費程序時奇怪的變化()

我正在寫一個非常簡單的文件系統,基本上是:從文件

-reads在數據塊-gets從該塊散列
- 搜索鏈表的散列
- 如果沒有找到,追加
- 如果找到,什麼也不做

問題:(?可能泄漏)
當我不使用免費的,程序是慢了很多。

當我使用免費時,程序運行速度更快,完成塊大小爲128和256,但是當我嘗試512(插入時崩潰)時崩潰。我在視覺工作室工作,它只是崩潰。我得到了「VS停止工作..」的消息,沒有提供任何見解。

最重要的是,當我使用free和不使用它時,我得到了很多不同的結果。

任何幫助將非常感激。

好了,一些代碼(略):

struct list_el 
{ 
    char* hash; 
    struct list_el* next; 
    struct list_el* prev; 
}; 
typedef struct list_el item; 

item* head, *tail; 

void ins(item* ins) 
{ 
item* iterator = (item*)malloc(sizeof(item)); 
if(iterator == NULL) 
{ 
    printf("out of memory\n"); 
    exit(1); 
} 
else if(head != NULL) 
{ 
    iterator = head; 
    while(iterator != NULL) 
    { 
     if(strcmp(iterator->hash, ins->hash) == 0) 
     { 
      //free(iterator); (problem line) 
      matches++; 
      return; 
     } 
     else if(iterator->next != NULL) 
      iterator = iterator->next; 
     else 
      break; 

    } 
} 

unique_blocks++; 
if(head == NULL) 
{ 
    head = ins; 
    ins->prev = NULL; 

} 

else 
{ 
    tail->next = ins; 
    ins->prev = tail; 
} 

tail = ins; 
ins->next = NULL; 
} 


int main() 
{ 
unsigned char* c = (unsigned char*)malloc(BLOCKSIZE+1); 
if(c == NULL) 
    exit(1); 
FILE* fp = fopen("input2","r"); 
if(fp == NULL) 
    exit(1); 
int i = 0; 

char* answer = (char*)malloc(sizeof(char)*90); 
if(answer == NULL) 
    exit(1); 
item* ins_item; 
char ch; 
do 
{ 
    if(i == BLOCKSIZE) 
    {  
     i = 0; 
     answer = sha1((unsigned char*)c); 
     ins_item = (item*)malloc(sizeof(item)); 
     if(ins_item == NULL) 
      exit(1); 
     ins_item->hash = answer; 
     ins(ins_item); 

    } 
    else 
    { 
     ch = fgetc(fp); 
     bytes_read++; 
     c[i] = ch; 
     i++; 
    } 
}while(ch != EOF); 
fclose(fp); 
return 0; 
} 

回答

6

在你ins()功能您:

  • malloc()記憶和使用iterator以後指向它

  • 幾條語句你做iterator = head,這意味着你失去了指向分配的內存區域的指針一個主要的內存泄露

  • 那之後的幾個聲明你/不要(取決於評論)free()項指向的迭代器,而它是仍然在你的名單,而你可能想免費從malloc()

編輯區域:

爲什麼你的迭代器分配內存?通常列表迭代器是簡單的指針,指向代碼當前正在檢查的任何項目。

編輯2:

崩潰,很可能是你的程序訪問釋放(因而anavailable)的內存,依然是你的列表的一部分引起的。

釋放的內存不一定返回到系統。根據堆分配器的工作方式,它甚至可以通過另一個malloc()調用再次分配給您的程序。當您的程序嘗試再次訪問它時,它可能會有比預期的數據非常不同的數據。其他

兩點:

  • 保持你的標識符相同的範圍內是唯一的。它可能不會使編譯器停止,但它確實會使人類的大腦停止。例如。您應該沒有帶ins參數的ins()函數。

  • Visual Studio有一個調試器(我被告知)非常好。學習如何使用它會幫助你lot

0

而且你爲什麼要做:

while(iterator != NULL) 
{ 
    if(strcmp(iterator->hash, ins->hash) == 0) 
    { 
     //free(iterator); (problem line) 
     matches++; 
     return; 
    } 
    else if(iterator->next != NULL) 
     iterator = iterator->next; 
    else 
     break; 

} 

這在功能上等同於:

​​

但你的版本更長,更可能以後發展的錯誤。

+0

好點。謝謝。 – prelic 2010-12-09 11:01:10