Как обрабатывать ошибки free () в C? - PullRequest
4 голосов
/ 30 июня 2011

Предположим, что я использовал функцию free(), чтобы освободить память, которая по многим причинам мне не разрешена.Как я могу остановить сбой моего приложения C и просто сгенерировать ошибку и продолжить выполнение?У меня нет здесь такого типа условия try-catch (как C ++ / java ...).Есть ли способ игнорировать эту ошибку и продолжить выполнение?

Если да,

  1. Как вы это делаете?
  2. Что более важно, целесообразно ли это делать (продолжение выполнения с учетом этой ошибки памяти)?

Спасибо

Ответы [ 3 ]

8 голосов
/ 30 июня 2011

Это, конечно, не рекомендуется. Даже если версия вашей программы free правильно обнаруживает, что память, которую вы пытаетесь освободить, не может быть освобождена и, следовательно, не приносит никакого вреда сама по себе, в вашей программе все равно есть ошибка - часть программы, которая, как она думала, принадлежит эта память. Кто знает, что он мог попытаться сделать с этой памятью, прежде чем освободить ее? Найдите и исправьте ошибку. Не суйте это под ковер.

5 голосов
/ 30 июня 2011

В стандарте C нет ничего, что вы могли бы использовать, чтобы делать то, что вы хотите.Описание функции free очень ясно на этом (§7.20.3.2 в C99):

Свободная функция вызывает освобождение пространства, на которое указывает ptr, то есть делает доступнымдля дальнейшего распределения.Если ptr является нулевым указателем, никаких действий не происходит. В противном случае, если аргумент не совпадает с указателем, ранее возвращенным функцией calloc, malloc или realloc, или если пространство было освобождено вызовом free или realloc, поведение не определено.*

0 голосов
/ 30 июня 2011

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

Единственные указатели, которые вы должны использовать free - это те, которые вы получаете от malloc, calloc или realloc или NULL указателей. Кроме того, вы не должны использовать free для одного и того же указателя более одного раза.

...