Каковы некоторые из основных причин утечки памяти и ошибки сегментации? - PullRequest
2 голосов
/ 23 октября 2009

Каковы основные причины ошибок типа «Утечка памяти и ошибка сегментации»?

Ответы [ 4 ]

5 голосов
/ 23 октября 2009

ошибка сегментация:

  • использование висячих указателей: не сбрасывать указатели после освобождения
  • не проверяет указатель перед использованием
  • не инициализирует переменные / члены

Утечки памяти / ресурсов:

  • забыв освободить ресурс (свободная память, закрыть файл, ...)
  • в средах с сборщиком мусора: создание кольца ссылок на объекты

Как обнаружить / избежать:

  • висячие указатели: правило кодирования, строго сбрасывать указатели после освобождения
  • используйте статическую проверку кода для избежания большинства ошибок
  • использовать динамический анализатор кода для проверки утечки ресурсов
2 голосов
/ 23 октября 2009

Утечки памяти : Обычно это относится к языку, подобному C, где вы управляете памятью вручную. В этом случае вы будете выделять память, не освобождая ее, когда вы закончите ее использовать. Выделения продолжают накапливаться во время работы приложения, и память не может быть освобождена, пока процесс не завершится. Утечки памяти (Википедия)

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

int* ptr;
...
...
...
*ptr = 5;

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

1 голос
/ 23 октября 2009

лотов, в том числе:

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

Не все из них применимы ко всем языкам, но об этих полезных вещах стоит задуматься.

0 голосов
/ 23 октября 2009

См. Серию Effective C ++ в Addison Wesley, очень хорошо подойдет именно для этой проблемы. Обратите внимание, что при использовании указателя необходимо отдельно удалить все элементы, а затем указатель - это требует умения и часто неверно, что приводит к скрытым ошибкам, которые не отображаются легко. Другие постеры имеют ответы, я только добавляю дополнительную деталь.

...