Я немного запутался.
Я пишу очень простую файловую систему, которая в основном:
-читает в блок данных из файла
-получает хеш из этогоblock
- поиск связанного списка для этого хэша
- если не найдено, добавить
- если найдено, ничего не делать
Проблема:
Когда я не использую free, программа намного медленнее (вероятно, утечка?).
Когда я использую free, программа работает быстрее, заканчивается с размерами блоков 128 и 256, но вылетает при попытке 512 (вылетает при вставке).Я работаю в визуальных студиях, и это просто вылетает.Я получаю сообщение «VS прекратил работать ..», которое не дает никакой информации.
Кроме того, я получаю очень разные результаты, когда использую бесплатное и когда я не использую его.
Любая помощь будет принята с благодарностью.
Хорошо, некоторый код (сокращенно):
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;
}