我有一个程序,当我从键盘输入错误的数据时,它会使用 exit(1)
退出。
我正在使用 Valgrind 进行测试,尽管这种情况下没有错误,但我可以看到仍然存在可达的 x 字节。
所以我的问题是:在触发 exit()
之前,程序员是否需要释放内存,还是操作系统会自动处理?
这是一个不错的想法(在旧版本的Windows中甚至是必要的),但在现代操作系统上,当程序使用exit()
退出时,其整个地址空间将被回收。
IPC_PRIVATE
。 - geekosaur假设我们谈论的是用户空间,我认为通常可以安全地假设在exit()退出时保留内存不是错误。然而,在正常执行期间到达程序结尾且不在exit()中进行解除分配的程序设计是不好的。
在退出程序之前释放内存是一个不好的主意。这样做没有任何好处,只会浪费时间,在多线程程序中,如果其他线程没有被加入并且可能访问一些已分配的内存,它实际上可能会导致错误。
"仍然可达"并不是泄漏。请考虑:
#include <stdlib.h>
void *a_global;
int main() {
void *a_local = malloc(10);
a_global = malloc(20);
}
gcc -g t.c && valgrind ./a.out
==12228== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==12228== Using Valgrind-3.7.0.SVN and LibVEX; rerun with -h for copyright info
==12228== Command: ./a.out
==12228==
==12228==
==12228== HEAP SUMMARY:
==12228== in use at exit: 30 bytes in 2 blocks
==12228== total heap usage: 2 allocs, 0 frees, 30 bytes allocated
==12228==
==12228== LEAK SUMMARY:
==12228== definitely lost: 10 bytes in 1 blocks
==12228== indirectly lost: 0 bytes in 0 blocks
==12228== possibly lost: 0 bytes in 0 blocks
==12228== still reachable: 20 bytes in 1 blocks
==12228== suppressed: 0 bytes in 0 blocks
在这里,当你到达退出点时,a_local
已经超出了作用域。没有任何方法可以释放该内存;它永远丢失了。这就是泄漏。
另一方面,你可以轻松地释放a_global
(虽然你不应该这样做),它是可访问的,并且不是泄漏。
a_local
吗? - Lawrence Velázquez