检查是否免费工作

时间:2016-12-06 15:49:38

标签: c malloc free

我已阅读此问题并回答:How do malloc() and free() work?

一位朋友问我怎样才能确定免费工作。我回答说,如果它不起作用,那么操作系统可能会崩溃,而且它不再重要。

但是我对这个问题的答案的本质更感兴趣。 一旦我释放了记忆,我怎么能确定它已被释放? 我只是假设它吗? 这是一个纯粹的理论问题,背后没有实际的代码,而且大多数时候考虑到我决定"它无论如何都不重要#34;但我对这个答案感到不安。

例如,如果内存有问题,我想确保在免费拨打后释放大型结构,否则我会再次尝试清理,有没有办法做到这一点?

编辑: 对于那些在此回答我的问题的人:Function free() in C isn't working for me 在那里提供的答案简单地指出我实际上无法测试free()是否有效"。我试图理解为什么不能这样做。免费背后的本质是什么。

EDIT2: 在阅读完答案之后,似乎我接受了我给我朋友的答案,那就是"它只是起作用"。

5 个答案:

答案 0 :(得分:6)

free"无法正常工作的唯一方式"如果你传递一个无效的指针或已经被释放的指针。这样做会调用undefined behavior

来自man page

  

free()函数释放ptr指向的内存空间   必须先前拨打malloc()calloc()或   realloc()否则,或者之前已经调用free(ptr),   发生未定义的行为。如果ptrNULL,则不执行任何操作。

如果您使用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