[英]Allocating more than needed
我編寫了一個代碼,分配了一個緩沖區,該緩沖區分配了文件的內容。 通過 valgrind 運行代碼給了我這個
總堆使用量:9 次分配,7 次釋放,已分配 10,905 字節
如果我沒記錯的話,代碼只分配了 3 次,我在需要時處理定位。
void read_from_file (const char* filename, size_t length, char* buffer)
{
/* put your code here */
FILE* fOpen;
buffer = (char*)malloc(length+1);
fOpen = fopen(filename, "r");
if(!buffer) // --- Failed to allocate
printf("Failed to allocate...\n");
else if(!fOpen){ // --- Failed to open file
free(buffer);
fprintf(stdout, "Failed to read %s\n", filename);
buffer = NULL;
}
else if(fgets(buffer, length+1, fOpen)!=NULL){ // Buffer has been copied
fprintf(stdout, "buff is: %s\n", buffer);
free(buffer);
buffer = NULL;
}
else{ // --- Failed to copy correctly
fprintf(stdout, "Failed to copy %s file...\n", filename);
free(buffer);
buffer = NULL;
}
}
void main (int argc, char **argv)
{
char* buff = NULL;
read_from_file("test1.txt",10,buff);
read_from_file("test2.txt",10,buff);
read_from_file("test3.txt",10,buff);
}
看起來你沒有內存泄漏,但你沒有關閉你打開的文件。 這是 Valgrind 報告中“仍可訪問”塊的來源。 在從read_from_file()
函數返回之前只需fclose(fOpen)
。
此外, main()
的返回類型是int
,而不是void
。 這是您更新的代碼:
#include <stdio.h>
#include <stdlib.h>
void read_from_file (const char* filename, size_t length, char* buffer)
{
/* put your code here */
FILE* fOpen;
buffer = malloc(length+1);
fOpen = fopen(filename, "r");
if(!buffer) // --- Failed to allocate
printf("Failed to allocate...\n");
else if(!fOpen){ // --- Failed to open file
free(buffer);
fprintf(stdout, "Failed to read %s\n", filename);
buffer = NULL;
}
else if(fgets(buffer, length+1, fOpen)!=NULL){ // Buffer has been copied
fprintf(stdout, "buff is: %s\n", buffer);
free(buffer);
buffer = NULL;
}
else{ // --- Failed to copy correctly
fprintf(stdout, "Failed to copy %s file...\n", filename);
free(buffer);
buffer = NULL;
}
if (fclose(fOpen) != 0) {
fprintf(stderr, "Unable to close file");
}
}
int main (void)
{
char* buff = NULL;
read_from_file("test1.txt",10,buff);
read_from_file("test2.txt",10,buff);
read_from_file("test3.txt",10,buff);
return 0;
}
Valgrind 的輸出:
==3564== HEAP SUMMARY:
==3564== in use at exit: 0 bytes in 0 blocks
==3564== total heap usage: 6 allocs, 6 frees, 1,737 bytes allocated
==3564==
==3564== All heap blocks were freed -- no leaks are possible
==3564==
==3564== For counts of detected and suppressed errors, rerun with: -v
==3564== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.