Мне до сих пор не приходилось использовать strdup(stringp)
вместе с strsep(&stringp_copy, token)
, и я думаю, что это вызывало утечку памяти.strdup() утечка памяти даже после освобождения()
(strdup()
всегда free
«d нормально раньше.)
Я зафиксировал утечку, и я думаю, что я понимаю, как, но я просто не могу понять, почему мне нужно.
Оригинальный код (кратко):
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», строка) »- либо безопасны, либо эквивалентны. –
'message_copy' перезаписывается strsep. Прочтите этого человека. – Marian
Спасибо, @JonathanLeffler. 'printf (строка)' был для быстрой и грязной отладки. – oliverseal