Как я могу узнать, что выделенное пространство успешно освобождено? - PullRequest
6 голосов
/ 02 мая 2011

Кто-нибудь знает, как мы можем проверить, было ли выделенное пространство успешно освобождено?На странице руководства написано, что «free () не возвращает значения».

Ответы [ 4 ]

12 голосов
/ 02 мая 2011

Есть три возможных случая:

free( NULL );     // does nothing, so always works
free( malloc(42) );  // does something, always works
free( 666 );      // undefined behaviour - returned value would be meaningless

Таким образом, нет случая, когда у теста free() есть точка.

10 голосов
/ 02 мая 2011

Нет возвращаемого значения, потому что нет ошибки.free всегда успешно.Там нет ничего, чтобы проверить.

Обратите внимание, что это предполагает, что вы используете его правильно.Если вы передадите free указатель, который недопустим в качестве аргумента free, например, неинициализированный указатель, указатель на уже освобожденный объект или указатель на объект, не полученный malloc, тогдаваша программа имеет неопределенное поведение .Это не сообщаемая ошибка;скорее это означает что-нибудь могло случиться .

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

«Неправильное» бесплатное завершение работы вашего приложения, поэтому нет необходимости проверять его работоспособность:)

Пример:

#include <stdlib.h>

int main(int argc, char **argv) {
    char *a = malloc(sizeof(*a) * 10);
    free(a);
    free(a);
    return 0;
}

$ ./example * Обнаружен glibc ./ Пример: двойное освобождение или повреждение (fasttop): 0x08a3e008 ** ======= Backtrace: ========= /lib/libc.so.6(+0x6c501)[0x17c501]

0 голосов
/ 02 мая 2011

Если вы хотите проверить внутреннюю работу распределителя кучи, я не думаю о стандартном способе сделать это.

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

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