[英]Why Does my program have Memory Leaks?
我正在嘗試創建一個小的c程序 ,它將讀取任意大小的字符串,而不會有任何內存泄漏。
根據我的研究,函數malloc可用於為我們想要存儲的任何數據分配多個字節。
在我的計划,我通過為0個字符分配空間開始,我使指針字指向它。 然后,每當我讀到一個字符,我做一個指針oldWord指向的話 ,一旦我分配了新的角色更大的內存位置,其釋放舊的內存位置。
我的研究表明, free函數可用於釋放不再需要的舊內存位置。 但是,我不確定我哪里出錯了。 您可以在下面看到我的代碼。
#include <stdio.h>
#include <stdlib.h>
int main(void){
char *word = malloc(0);
printf("Enter name: ");
readWord(word);
printf("Your name is: %s\n", word);
free(word);
word = realloc(0);
printf("Enter name: ");
readWord(word);
printf("Your name is: %s\n", word);
free(word);
return 0;
}
void readWord(char *word){
int i = 0;
char *oldWord, c = getchar();
while(c != ' ' && c != '\n'){
oldWord = word;
word = realloc(word, i + 1);
free(oldWord);
word[i++] = c;
c = getchar();
}
oldWord = word;
word = realloc(word, i + 1);
free(oldWord);
word[i] = '\0';
}
我在這里看到的問題是
free(oldWord);
沒有檢查realloc()
的失敗 。 如果realloc()
成功,將相同的指針傳遞給free()
會導致未定義的行為 。
那說,還有一些說明
像這樣的語法
word = realloc(word, i + 1);
是危險的,如果realloc()
失敗,你也會失去實際的指針。 您應該使用臨時指針來保存realloc()
的返回值,檢查是否成功,然后,如果需要,將其分配回原始指針。
在您的代碼中, c
是char
類型,可能不足以保存getchar()
返回的所有可能值,例如EOF。 您應該使用int
類型,即getchar()
返回的類型。
您的代碼中存在多個問題:
你free
傳遞給realloc()
的指針。 這是不正確的,因為如果移動塊, realloc()
將釋放內存。 否則指針被釋放兩次。
指針重新分配bu readWord()
永遠不會傳遞給調用者。
分配0大小的塊具有未指定的行為:它可能返回NULL
或有效指針,該指針不應被解除引用但可以傳遞給free()
或realloc()
。
您不測試文件結尾:如果文件中沒有空格或換行符,則存在無限循環,例如,如果文件為空。
你在調用之前沒有readWord()
的原型。
這是一個改進而簡單的版本:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
char *readWord(void);
int main(void) {
char *word;
printf("Enter name: ");
word = readWord();
if (word == NULL) {
printf("Unexpected end of file\n");
else
printf("Your name is: %s\n", word);
free(word);
return 0;
}
char *readWord(void) {
int c;
size_t i = 0;
char *word = NULL;
while ((c = getchar()) != EOF && !isspace(c)) {
word = realloc(word, i + 2);
if (word == NULL)
break;
word[i++] = c;
word[i] = '\0';
}
return word;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.