#c #memory #valgrind #free #strdup
#c #память #valgrind #Бесплатно #strdup
Вопрос:
Я использую strdup для дублирования значения внутри команды. Я также освобождаю его в конце своего цикла, чтобы убедиться, что у меня ничего не протекает, но valgrind, похоже, не согласен со мной и говорит, что то, что выделяется с этим strdup, протекает. Есть идеи?
Вот мой код:
int main(void)
{
init_ui();
hist_init(100);
char *command;
while (true) {
signal(SIGINT, SIG_IGN);
command = read_command();
if (command == NULL) {
break;
}
char *copy = strdup(command);
char *args[4096];
int tokens = 0;
char *next_tok = command;
char *curr_tok;
while((curr_tok = next_token(amp;next_tok, " tnr")) != NULL) {
if(strncmp(curr_tok, "#", 1) == 0){
break;
}
args[tokens ] = curr_tok;
}
args[tokens] = NULL;
if(args[0] == NULL) {
continue;
}
hist_add(copy);
int builtin_status = handle_builtins(tokens, args);
if(builtin_status == 0) {
continue;
}
pid_t child = fork();
if(child == -1){
perror("fork");
}
else if(child == 0){
int ret = execvp(args[0], args);
if(ret == -1) {
perror("execvp");
}
close(fileno(stdin));
close(fileno(stdout));
close(fileno(stderr));
exit(EXIT_FAILURE);
}
else {
int status;
waitpid(child, amp;status, 0);
set_last_status(status);
}
hist_destroy();
free(copy);
}
return 0;
}
Вот что дает мне valgrind, я действительно пытаюсь понять, что не так, потому что кажется, что то, что определено с помощью этого strdup, освобождается:
HEAP SUMMARY:
==359074== in use at exit: 18 bytes in 2 blocks
==359074== total heap usage: 72 allocs, 70 frees, 20,000 bytes allocated
==359074==
==359074== 18 bytes in 2 blocks are definitely lost in loss record 1 of 1
==359074== at 0x483977F: malloc (vg_replace_malloc.c:307)
==359074== by 0x4A7D23E: strdup (in /usr/lib/libc-2.31.so)
==359074== by 0x10A703: main (shell.c:85)
==359074==
==359074== LEAK SUMMARY:
==359074== definitely lost: 18 bytes in 2 blocks
==359074== indirectly lost: 0 bytes in 0 blocks
==359074== possibly lost: 0 bytes in 0 blocks
==359074== still reachable: 0 bytes in 0 blocks
==359074== suppressed: 0 bytes in 0 blocks
Комментарии:
1. Перед вами куча
continue;
sfree(copy);
— они, очевидно, будут пропускать память2. Итак, каждый раз, когда я продолжаю, я освобождаю перед тем, как правильно?
3. Где у вас
free()
память, которая была выделена,command = read_command();
которая затем была продублирована*copy
?4. Я … не :/ Но раньше это не вызывало никаких проблем
5. Возможно, это указывало на
static
массив, вread_command();
которомfree()
не может быть общего. Проблемы публикации неполного кода…
Ответ №1:
strdup()
используется malloc()
для выделения памяти, поэтому для повторного strdup()
copy
использования она должна быть освобождена.
Как прокомментировал UnholySheep выше, continue
это приводит к игнорированию free()
инструкции. Одно из решений для устранения этой проблемы — поставить дополнительный free()
оператор перед каждым continue
.