Как узнать, работает ли функция C free? - PullRequest
3 голосов
/ 17 марта 2011

Я видел некоторые различия в результате следующего кода:

#include <stdio.h>
#include <malloc.h>
#include <string.h>

int main(void)
{
 char* ptr;
 ptr = (char*)malloc(sizeof(char) * 12);
 strcpy(ptr, "Hello World");

 printf("%s\n", ptr);
 printf("FREEING ?\n");

 free(ptr);

 printf("%s\n", ptr);
}

Позвольте мне объяснить:

При третьем вызове printf в зависимости от ОС я получаю разные результаты, gargabgeсимволы в Windows, ничего в Linux и в системе Unix «Hello World» не печатается.

Есть ли способ проверить состояние указателя, чтобы узнать, когда освободилась память?

Я думаю, что этот механизм печати нельзя доверять все время.

Thnaks.

Привет.

Ответы [ 3 ]

8 голосов
/ 17 марта 2011

Использование указателя после его освобождения приводит к неопределенному поведению.

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

Нет способа посмотреть на указатель и «узнать, когда память была освобождена». Вы, как программист, должны следить.

5 голосов
/ 17 марта 2011

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

Хорошей идеей будет всегда присваивать nil переменной указателя, как только вы ее освободите. Таким образом, вы знаете, что не нулевые указатели безопасны в использовании.

3 голосов
/ 17 марта 2011

Простой ответ: вы не можете проверить, был ли указатель уже освобожден в C. Различное поведение, вероятно, связано с разными компиляторами, так как использование указателя после его освобождения неопределено, вы можете получить все виды поведения (включая SEGFAULT).и завершение программы).

Если вы хотите проверить, используете ли вы free property и не утечка памяти в вашей программе, используйте такой инструмент, как Valgrind.

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