Есть ли способ проверить, что выделение памяти указателя было освобождено? - PullRequest
7 голосов
/ 20 мая 2011

Есть ли способ сказать, что выделение памяти указателя было освобождено?Я только начинаю в C, и мне кажется, что я наконец начинаю понимать тонкости управления памятью в C.

Так, например:

char* pointer;
pointer = malloc(1024);

/* do stuff */

free(pointer);

/* test memory allocation after this point */

Iзнать, что указатель будет сохранять адрес памяти до тех пор, пока я не установлю pointer = NULL - но есть ли способ проверить, что указатель больше не ссылается на память, которую я могу использовать, без необходимости сначала устанавливать его в NULL?

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

Ответы [ 4 ]

5 голосов
/ 20 мая 2011

Нет стандартизированного управления памятью, которое бы указывало, является ли какой-либо данный адрес частью выделенного в данный момент блока памяти.

Для целей юнит-теста вы можете создать глобальную карту, которая отслеживает каждое выделение, поэтому вы заставляете каждое выделение проходить через свою пользовательскую функцию malloc, которая добавляет запись к карте в отладочных сборках и удаляет ее снова в free.

2 голосов
/ 20 мая 2011

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

Не идеально, потому что вы вводите разницу в производстве и тестированииокружения.

И некоторые системы могут предоставлять достаточное количество инструментария в своей версии стандартной библиотеки.Например, библиотека Mac OS 10.5 поддерживает вызов abort (3) в режиме двойного освобождения, поэтому, если ваш тестер блоков может перехватывать сигналы, вы свободны дома.


Бесстыдное и бессмысленное самореклама: моя маленькая игрушкаc модульное тестирование может ловушка сигналов.

1 голос
/ 20 мая 2011

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

0 голосов
/ 14 мая 2014

Используйте хорошие практики c. Пример:

char* pointer = NULL;

/* do stuff */

pointer = malloc(1024);/* malloc does not always work, check it. */

if(pointer == NULL) {
/*Help me, warn or exit*/
}

/* do stuff */

if(pointer) {
    free(pointer);
    pointer = NULL;
}

/* do stuff */

if(pointer) {
/* tested memory allocation stuff */
}

Дольше, да, но если вы всегда устанавливаете освобожденный указатель на NULL, это легко проверить.

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