Как избежать утечки памяти при разработке в c - PullRequest
3 голосов
/ 22 ноября 2011

Iam программирование на C. Я хочу знать, какой практике мы должны следовать, чтобы избежать утечек памяти во время самого развития. Пожалуйста, укажите меры предосторожности, которые должны быть приняты во время работа со строками и динамическим распределением памяти.

Ответы [ 5 ]

9 голосов
/ 22 ноября 2011

Я не согласен с отрицательным ответом на этот вопрос.Я думаю, что это настоящий вопрос, и довольно глубокий.

На первый взгляд, ответ "вызов free на любую память, которую вы malloc ed".

Но настоящий ответчто ваш дизайн должен включать модель владения clear .Единственный способ избежать утечек памяти и доступа к зависшей памяти - это всегда знать, для каждого фрагмента динамически выделяемой памяти, какой объект владеет этой памятью (и отвечает за ее удаление).1012 * Если у вас нет такой четкой модели владения, вы всегда будете охотиться за утечками памяти и ошибками использования после освобождения (это также относится к C ++).Использование сборщика мусора позволит вам обойти эти проблемы за счет значительных циклов ЦП.

Если у вас есть четкая модель владения, эти проблемы обычно просто исчезают: владелец free s вся памятьоно владеет, когда оно само утилизируется.

6 голосов
/ 22 ноября 2011

Используйте переменные в стеке, если это возможно, вместо использования памяти из кучи.

Старайтесь избегать распространенных ошибок, несколько указателей:

  1. Обязательно звоните free() при использовании malloc() или calloc().
  2. Не переназначать указатель, который указывает на выделенную ячейку памяти, без free() первого его указания, т.е. не теряйте ссылку.
  3. Будьте осторожны при использовании realloc(). Не используйте один и тот же указатель для входных и выходных параметров.

Избегайте распространенных ошибок, сделанных с использованием строк , с несколькими указателями:

  1. Убедитесь, что есть память для завершения NUL символа.
  2. Убедитесь, что string завершено NUL во всех ваших случаях использования (даже при использовании в таких функциях, как strncpy() и т. Д.)

Научитесь использовать отладчик ( gdb )
Научитесь использовать инструменты статического анализа. Такие инструменты, как splint , valgrind , clang могут быть установлены в вашей системе Linux из репозитория пакетов вашего дистрибутива.

Несколько полезных ссылок:
c-faq - Массивы и указатели
c-faq - Распределение памяти
Secure C Coding - Управление памятью
SO Вопрос, связанный с предотвращением утечки памяти в C / C ++
Учебник по yolinux

Надеюсь, это поможет!

3 голосов
/ 22 ноября 2011

Единственный способ избежать утечки памяти - вручную free() вся память, выделенная вами в течение жизненного цикла вашего кода.

Вы можете использовать такие инструменты, как valgrind, чтобы проверить утечки памяти.Он покажет всю память, которая не освобождается при завершении программы.

2 голосов
/ 22 ноября 2011

Существует возможность сбора мусора в С, в частности, с использованием Консервативного Бома ГХ . Чтобы использовать его, замените malloc на GC_malloc, strdup на GC_strdup во всей вашей программе, и вам не следует беспокоиться о вызове free или GC_free. ГК Бема хорошо работает на практике (даже если в теории существует небольшая вероятность утечки).

Обратите внимание, что наличие данных в реальном времени не является модульным свойством: данный фрагмент данных работает во всей программе (а не в конкретном данном модуле).

Чтобы ответить на первоначальный вопрос, важной задачей является определение политики распределения и ее документирование. В частности, каждая функция, возвращающая динамически распределенные данные, должна указывать, как и кем эти данные должны быть free -d.

добавления

Полезный инструмент для поиска ошибок утечки памяти в C (или C ++) в Linux - valgrind . Не забывайте передавать -g -Wall флаги gcc и g++ при разработке кода.

0 голосов
/ 22 ноября 2011

Я не программист на C, но обычно вам нужно уничтожать или утилизировать все, что вы больше не используете.

Если вы не утилизируете объекты, а строки являются объектами, то память может не собираться мусором и оставаться в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...