我从未需要使用
新的不泄漏内存的代码:
strdup(stringp)
与strsep(&stringp_copy, token)
一起,直到最近我发现这可能会导致内存泄漏。
(strdup()
以前总是可以正常free
的。)
我已经修复了内存泄漏问题,并且我认为我理解了如何修复,但我无法弄清楚为什么我需要这样做。
原始代码(摘要):
const char *message = "From: username\nMessage: basic message\n";
char *message_copy, *line, *field_name;
int colon_position;
message_copy = strdup(message);
while(line = strsep(&message_copy, "\n")) {
printf(line);
char *colon = strchr(line, ':');
if (colon != NULL) {
colon_position = colon - line;
strncpy(field_name, line, colon_position);
printf("%s\n", field_name);
}
}
free(message_copy);
新的不泄漏内存的代码:
const char *message = "From: username\nMessage: basic message\n";
char *message_copy, *freeable_message_copy, *line, *field_name;
int colon_position;
freeable_message_copy = message_copy = strdup(message);
while(line = strsep(&message_copy, "\n")) {
printf(line);
char *colon = strchr(line, ':');
if (colon != NULL) {
colon_position = colon - line;
strncpy(field_name, line, colon_position);
printf("%s\n", field_name);
}
}
free(freeable_message_copy);
在第一段代码中,message_copy
指针是如何被覆盖的?还是没有被覆盖?
printf(line)
;如果line
包含类似于printf()
格式字符串转换说明符,它将会读取或者写入错误的内存。可以使用fputs(line, stdout)
或者printf("%s", line)
,它们是安全的且等效的。 - Jonathan Lefflermessage_copy
被strsep
覆盖了。请阅读手册。 - Marianprintf(line)
是为了快速而简单的调试。 - oliverseal