我已阅读此问题并回答:How do malloc() and free() work?
一位朋友问我怎样才能确定免费工作。我回答说,如果它不起作用,那么操作系统可能会崩溃,而且它不再重要。
但是我对这个问题的答案的本质更感兴趣。 一旦我释放了记忆,我怎么能确定它已被释放? 我只是假设它吗? 这是一个纯粹的理论问题,背后没有实际的代码,而且大多数时候考虑到我决定"它无论如何都不重要#34;但我对这个答案感到不安。
例如,如果内存有问题,我想确保在免费拨打后释放大型结构,否则我会再次尝试清理,有没有办法做到这一点?
编辑:
对于那些在此回答我的问题的人:Function free() in C isn't working for me
在那里提供的答案简单地指出我实际上无法测试free()
是否有效"。我试图理解为什么不能这样做。免费背后的本质是什么。
EDIT2: 在阅读完答案之后,似乎我接受了我给我朋友的答案,那就是"它只是起作用"。
答案 0 :(得分:6)
free
"无法正常工作的唯一方式"如果你传递一个无效的指针或已经被释放的指针。这样做会调用undefined behavior。
来自man page:
free()
函数释放ptr
指向的内存空间 必须先前拨打malloc()
,calloc()
或realloc()
。 否则,或者之前已经调用free(ptr)
, 发生未定义的行为。如果ptr
为NULL
,则不执行任何操作。
如果您使用valgrind等内存检查工具运行程序,它会告诉您是否正确调用free
。
答案 1 :(得分:5)
如果内存有问题,我想确保在免费拨打后释放大型结构,否则我会再次尝试清理,有没有办法做到这一点?
不,没有合法的方法可以两次释放相同的内存。实际上,在释放的指针上调用free
会导致未定义的行为。这就是为什么你应该将释放的指针设置为NULL
,如果它们仍然在范围内。
也没有API来查看是否已释放内存地址,因此您的代码必须跟踪当前分配的内容,以便稍后释放它。
你只能将内存返回到操作系统:一旦你调用free
,它就不在你的手中了,所以你需要依靠操作系统和C库的内存管理器来正确记录释放的内存。
您可以做的最好的事情就是在典型工作负载下通过memory profiler运行代码,并修复所有错误。
答案 2 :(得分:3)
您无法验证特定内存分配。没有系统调用询问分配是否仍然已分配或已被释放。
然而,由于内存管理,特别是内存泄漏(分配未释放),对已经释放的内存,双重释放和内存损坏的引用是所有编程语言中的一个严重问题,具有显式内存管理,有调试这些类型的工具问题,如Purify,Insure ++,Valgrind或Boundschecker。
答案 3 :(得分:3)
free
不会返回任何值,或将errno
设置为任何值(除非您的编译器可能具有任何特定于实现的功能)。 free
的文档说:
free()函数释放ptr指向的内存空间,该内存空间必须由之前调用malloc(),calloc()或realloc()返回。否则,或者如果之前已经调用了free(ptr),则会发生未定义的行为。如果ptr为NULL,则不执行任何操作。
如果在未使用malloc
系列函数分配的内存上调用free,则结果未定义。如果您的程序在调用free
(或C ++中的operator delete
)时崩溃,则表示代码中其他位置的内存管理不佳。
答案 4 :(得分:0)
如上所述free并不返回任何值,只是为了验证我从结构&中初始化了一个成员。在使用之前和之后打印它。(仅供参考 - 这只是一个实验)
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 : %d\n", ptr_current->BookNumber); //got 123 as output
free(ptr_current);
printf("BookNumber Stored : %d\n", ptr_current->BookNumber); //Got some garbage value