LinuxForum.Fans
Тема

утечка али нет?

Автор: Fat-Zer 7 сообщений 2475 просмотров
#174066

собственно сабж:

text

if(fork()==0)
{
    char **str=malloc(3*sizeof(char*));
    str[0] = "/bin/ls";
    str[1] = "/";
    str[2] = 0;
    execvp("/bin/ls",str);
    free(str);
    exit(-1);
}

вроде не должно быть, но сторонние мысли не помешают...

#174084

1. Выделяем память под массив указателей
2. Выделяем память под строки, указатели заносим в массив
3. Освобождаем память выделенную под указатели в размере 3*sizeif(char*);

мне, кажеться, есть утечка....
Хотя, признаюсь, как вижу "**" так порой в ступор вгоняет... По крайней мере неуверен. :(

#174087

Хотя... Блин соменния совсем одолели...... Наверное я не прав... И утечки на самом деле нет.... НАдо еще разз буквари почитать....

#174089

кстати, а что говрит valgrind

#174113

ладно прокоментирую код...

text

if(fork()==0)
{ // ребёнок
    char **str=malloc(3*sizeof(char*)); // выделяем память в ребёнке
    str[0] = "/bin/ls";  // строки в стрике - тут утечки быть не может
    str[1] = "/";
    str[2] = 0;
    execvp("/bin/ls",str); // при удачном вызове exec возникают вопросы: освободится ли память при смерти процесса? освободится ли память при экзеке? освободится ли она вообще?
    free(str);  // это обработка ошибок exec, поидее даже без этой строчки при смерти процесса выделенная им память должна освобождаться, но в этом есть сомнения.
    exit(-1);   
}
voral написал:
кстати, а что говрит valgrind

написал сюда, потому что влом было его запускать smile + не знаю, правильно ли он будет с fork'ами работать... потом посмотрю...

#174426

Вроде нет утечки. Цитата из man execve(3p):


...shall replace the current process image with the new image...
...
Any shared memory segments attached to the calling process image shall not be attached to the new process image.
...
Any blocks of typed memory that were mapped in the calling process are unmapped, as if munmap() was implicitly called to unmap them.
...
Memory mappings created in the process are unmapped before the address space is rebuilt for the new process image.

Так что всё адресное пространство пересобирается, а отображения памяти через mmap() закрываются.
Кстати, (на всякий случай) открытые файлы не закрываются.

#174442
intelfx написал:
Вроде нет утечки. Цитата из man execve(3p):

мда, меня чего-то серьёзно заклинило.... спасибо smile

Войдите или зарегистрируйтесь, чтобы ответить.