检查是否免费工作
Checking if free worked
我已阅读此问答:How do malloc() and free() work?
有朋友问我如何确定免费工作。我回答说,如果它不起作用,那么 OS 可能会崩溃,而且不会持续太久。
但我对这个问题的答案的性质更感兴趣。
释放内存后,如何确定它已被释放? 我只是假设它做到了吗?
这是一个纯理论问题,没有实际代码支持,主要是在思考时我决定 "well it doesn't matter anyway",但我对这个答案感到不安。
例如,如果内存有问题,我想确保在调用 free 后释放了一个大型结构,否则我会再次尝试清理,有没有办法做到这一点?
编辑:
对于那些在此处回答我的问题的人:Function free() in C isn't working for me
那里提供的答案只是说我 "cannot actually test if free()
worked"。我试图理解为什么不能这样做。免费的本质是什么
编辑2:
阅读提供的答案后,似乎接受了我给朋友的答案,即 "it just works".
if memory is a problem and I want to make sure that a large structure was freed after calling free, otherwise I'll try cleaning up again, is there a way to do this?
不,没有合法的方法可以两次释放相同的内存。事实上,在释放的指针上调用 free
会导致未定义的行为。这就是为什么你应该将释放的指针设置为 NULL
如果它们要保留在范围内。
也没有 API 来查看内存地址是否已被释放,因此您的代码必须跟踪当前分配的内容,以便稍后释放它。
你只能做这么多将内存返回给操作系统:一旦你调用 free
,它就无法控制了,所以你需要依赖 OS 和内存您的 C 库管理员正确计算释放的内存。
你这边能做的最好的事情是 运行 在典型工作负载下通过 memory profiler 你的代码,并修复所有错误。
您无法验证具体的内存分配。没有系统调用询问分配是否仍在分配或已经被释放。
但是,由于内存管理,特别是内存泄漏(分配未释放)、对已释放内存的引用、双重释放和内存损坏在所有具有显式内存管理的编程语言中都是一个严重的问题,因此有一些工具可以调试这些问题,例如 Purify、Insure++、Valgrind 或 Boundschecker。
free
不 return 任何值,或将 errno
设置为任何值(除非您的编译器可能具有任何特定于实现的功能)。 free
的文档说:
The free() function frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc() or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behavior occurs. If ptr is NULL, no operation is performed.
如果您在未使用 malloc
系列函数分配的内存上调用 free,则结果未定义。如果您的程序在调用 free
(或 C++ 中的 operator delete
)时崩溃,则表明代码中其他地方的内存管理不善。
唯一的方法 free
"doesn't work" 是向它传递一个无效指针或已被释放的指针。这样做会调用 undefined behavior.
来自man page:
The free()
function frees the memory space pointed to by ptr
, which
must have been returned by a previous call to malloc()
, calloc()
or
realloc()
. Otherwise, or if free(ptr)
has already been called before,
undefined behavior occurs. If ptr
is NULL
, no operation is performed.
如果您 运行 您的程序使用 valgrind 等内存检查工具,它会告诉您是否调用 free
不正确。
如上所述,free 没有 return 任何值,只是为了验证我从结构中初始化了一个成员并在使用 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
我已阅读此问答:How do malloc() and free() work?
有朋友问我如何确定免费工作。我回答说,如果它不起作用,那么 OS 可能会崩溃,而且不会持续太久。
但我对这个问题的答案的性质更感兴趣。 释放内存后,如何确定它已被释放? 我只是假设它做到了吗? 这是一个纯理论问题,没有实际代码支持,主要是在思考时我决定 "well it doesn't matter anyway",但我对这个答案感到不安。
例如,如果内存有问题,我想确保在调用 free 后释放了一个大型结构,否则我会再次尝试清理,有没有办法做到这一点?
编辑:
对于那些在此处回答我的问题的人:Function free() in C isn't working for me
那里提供的答案只是说我 "cannot actually test if free()
worked"。我试图理解为什么不能这样做。免费的本质是什么
编辑2: 阅读提供的答案后,似乎接受了我给朋友的答案,即 "it just works".
if memory is a problem and I want to make sure that a large structure was freed after calling free, otherwise I'll try cleaning up again, is there a way to do this?
不,没有合法的方法可以两次释放相同的内存。事实上,在释放的指针上调用 free
会导致未定义的行为。这就是为什么你应该将释放的指针设置为 NULL
如果它们要保留在范围内。
也没有 API 来查看内存地址是否已被释放,因此您的代码必须跟踪当前分配的内容,以便稍后释放它。
你只能做这么多将内存返回给操作系统:一旦你调用 free
,它就无法控制了,所以你需要依赖 OS 和内存您的 C 库管理员正确计算释放的内存。
你这边能做的最好的事情是 运行 在典型工作负载下通过 memory profiler 你的代码,并修复所有错误。
您无法验证具体的内存分配。没有系统调用询问分配是否仍在分配或已经被释放。
但是,由于内存管理,特别是内存泄漏(分配未释放)、对已释放内存的引用、双重释放和内存损坏在所有具有显式内存管理的编程语言中都是一个严重的问题,因此有一些工具可以调试这些问题,例如 Purify、Insure++、Valgrind 或 Boundschecker。
free
不 return 任何值,或将 errno
设置为任何值(除非您的编译器可能具有任何特定于实现的功能)。 free
的文档说:
The free() function frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc() or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behavior occurs. If ptr is NULL, no operation is performed.
如果您在未使用 malloc
系列函数分配的内存上调用 free,则结果未定义。如果您的程序在调用 free
(或 C++ 中的 operator delete
)时崩溃,则表明代码中其他地方的内存管理不善。
唯一的方法 free
"doesn't work" 是向它传递一个无效指针或已被释放的指针。这样做会调用 undefined behavior.
来自man page:
The
free()
function frees the memory space pointed to byptr
, which must have been returned by a previous call tomalloc()
,calloc()
orrealloc()
. Otherwise, or iffree(ptr)
has already been called before, undefined behavior occurs. Ifptr
isNULL
, no operation is performed.
如果您 运行 您的程序使用 valgrind 等内存检查工具,它会告诉您是否调用 free
不正确。
如上所述,free 没有 return 任何值,只是为了验证我从结构中初始化了一个成员并在使用 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