Вопрос об утечке памяти, происходящей в дочернем процессе - PullRequest
1 голос
/ 18 июля 2011

Предположим, что функция func имеет ошибки, из-за чего происходит утечка памяти.

pid_t childPid;
int status;
childPid = fork();
if (childPid == -1)
  errExit("fork");
if (childPid == 0) /* Child calls func() and */
  exit(func(arg)); /* uses return value as exit status */

/* Parent waits for child to terminate. It can determine the
   result of func() by inspecting 'status'. */
if (wait(&status) == -1)
  errExit("wait");

Вопрос 1> Если программа теряет память, после того, как программа завершает работу в конце, она все еще теряет память, или система будет собирать всю память, выделенную программой, и утечки памяти больше нет?

Вопрос 2> После того, как родительский процесс вызывает ожидание, как происходит утечка памяти, вызванная функцией в дочернем процессе?

Ответы [ 3 ]

6 голосов
/ 18 июля 2011

Если программа теряет память, после того, как программа завершает работу, она все еще теряет память, или система будет собирать всю память, выделенную программой, и утечки памяти больше нет?

Система соберет все ресурсы памяти у дочернего элемента, и больше не будет утечки памяти из дочернего процесса.Также вызов fork() разделяет пространство памяти родительского и дочернего, поэтому утечка в дочернем процессе не будет протекать в родительском процессе, если вы не вызовете одну и ту же функцию с ошибками в обоих.

После того, как родительский процесс вызывает ожидание, как происходит утечка памяти, вызванная функцией в дочернем процессе?

Вызов wait() в родительском процессе, и утечка памяти в дочерней системе действительно не имеет ничего общего сдруг с другом.Вызов wait() в родительском элементе просто приводит к тому, что родительский блок блокирует ожидание сигнала, указывающего, что дочерний процесс завершен.Дочернему по-прежнему придется сначала вызвать func(), прежде чем он сможет завершить, поскольку он должен передать возвращаемое значение func() в exit().Следовательно, func() может все еще технически «утекать» память в том смысле, что он выделяет некоторую память в куче, но не очищает ее, даже несмотря на то, что действия по очистке ОС происходят почти сразу после вызова func().Другими словами, после завершения вызова exit() ОС высвободила ресурсы, используемые дочерним процессом, но сам func() все еще может не освободить память, которую он пытался выделить.

3 голосов
/ 19 июля 2011

Утечка памяти - это всего лишь один из видов утечки ресурсов.

Страницы памяти, выделенные, например, malloc (), называются «Личные страницы», поскольку они принадлежат только одному процессу (они могут быть скопированы).-записать общий доступ к родителю или потомку, но они все еще являются его собственными страницами.)

Однако существует множество других способов утечки ресурсов.Некоторые типы общих объектов не очищаются автоматически;файлы в файловой системе не будут автоматически очищаться, и дочерние процессы, созданные вашим ребенком, не будут автоматически очищены при его выходе.

3 голосов
/ 18 июля 2011

Любая современная операционная система не позволит дочернему процессу (или любому процессу) выйти из системы в несогласованном состоянии после ее завершения.

Если функция глючит в том смысле, что она приводит к ошибке сегментации, ОС обычно завершает процесс с сигналом SIGSEGV сразу после нарушения, и родительский элемент будет wait подтвержден, что ребенок вышел с сигналом, не нормально.

...