【发布时间】:2014-01-08 15:46:20
【问题描述】:
直到最近我才需要将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)— 既安全又等效。 -
message_copy被 strsep 覆盖。读懂这个人。 -
谢谢,@JonathanLeffler。
printf(line)用于快速而肮脏的调试。
标签: c gcc memory-leaks posix