我已经阅读了这个问题和答案:malloc()和free()如何工作?
一个朋友问我如何确定免费工作。我回答说,如果它不起作用,那么操作系统可能崩溃了,而且不会再多了。
,但我对这个问题的答案的本质更感兴趣。一旦我释放了记忆,我如何确定它已被释放?我只是假设它做到了吗?这是一个纯粹的理论问题,没有其背后的实际代码,大多数情况下,我决定"无论如何都没关系",但我对此答案感到不安。
例如,如果内存是一个问题,我想确保拨打电话后释放了一个大结构,否则我会尝试再次清理,有没有办法做到这一点?
编辑:对于那些说我的问题在这里回答的人:c中的function()在我身上不起作用在那里提供的答案只是说我"实际上无法测试free()
是否有效"。我试图理解为什么不能这样做。免费背后的自然是什么。
edit2:在阅读了答案后,我给我朋友的答案似乎被接受了,"它只是有效"。
free
"不起作用"的唯一方法是,如果您将其传递给了无效的指针或已被释放的指针。这样做调用了未定义的行为。
从"人"页面:
free()
功能使ptr
指向的内存空间释放了哪个 必须通过以前的电话返回malloc()
,calloc()
或realloc()
。否则,或者之前已经调用free(ptr)
, 发生未定义的行为。如果ptr
是NULL
,则不会执行操作。
如果您在诸如Valgrind之类的内存检查工具下运行程序,它将告诉您是否错误地调用free
。
如果记忆是一个问题,我想确保通话后释放了一个大结构,否则我会尝试再次清理,有没有办法做到这一点?
不,没有合法的方法可以两次释放同一记忆。实际上,在释放指针上称free
会导致不确定的行为。这就是为什么如果要保持范围,则应将释放的指针设置为NULL
。
也没有API查看是否已释放了存储器地址,因此您的代码必须跟踪当前分配的内容以便在以后的某个时刻释放它。
您只能做很多事情,将内存返回操作系统:调用free
后,它就不在您的手中,因此您需要依靠OS和C库的内存管理器来说明释放正确的内存。
最好在您身边做的最好的方法是通过其典型工作负载下的内存分析器运行代码,并修复所有错误。
free
不会返回任何值,也不会将errno
设置为任何内容(除非编译器可能具有任何特定于实现的功能)。free
的文档说:
free()函数释放了PTR指向的内存空间,必须由以前的呼叫返回malloc(),calloc()或realloc()。否则,或者如果之前已经调用了免费(PTR),则会发生不确定的行为。如果PTR为null,则不会执行操作。
如果您在未使用malloc
功能系列分配的内存上免费致电,则结果是未定义的。如果您的程序在调用free
(或C 中的operator delete
)时崩溃,则代码中其他位置的内存管理迹象。
您无法将其验证用于特定的内存分配。没有系统呼吁询问分配是否仍被分配或已释放。
但是,作为内存管理,特别是内存泄漏(分配未释放),对已经释放的内存,双释放和内存损坏是所有具有明确内存管理的编程语言中的严重问题,有一些工具可以调试这些类型诸如纯化,确保 ,valgrind或boundschecker之类的问题。
如上所述免费返回任何值,而只是为了验证我从结构中初始化了其中一个成员&在使用免费之前和之后打印它。(fyi-这只是一个实验)
struct BookList {
int BookNumber;
char BookName[4];
struct BookList * ptr_next;
}BookListVar,*ptr_BookList;
ptr_current = (struct ptr_BookList *)malloc(sizeof(struct BookList));
ptr_current->BookNumber = 123;
printf("BookNumber Stored : %dn", ptr_current->BookNumber); //got 123 as output
free(ptr_current);
printf("BookNumber Stored : %dn", ptr_current->BookNumber); //Got some garbage value