【发布时间】:2021-09-22 19:07:48
【问题描述】:
如果指向某个内存的唯一指针是我的main 函数中的一个局部变量,并且我通过从main 返回退出程序,那么该内存是否被认为“仍然可以访问”?
同样,如果我通过在某个函数中调用 exit 退出,那么仅由该函数(或调用它的函数)中的局部变量指向的内存是否被视为“仍然可访问”?如果我通过abort或_exit等其他方式退出呢?
我正在使用 C 语言,但我也很想知道这些在 C++ 中的工作方式是否有所不同。
【问题讨论】:
-
“仍然可以访问”意味着您在退出之前没有释放内存块,但有一个指向它的指针。这并不意味着退出程序后内存可用。分配内存分配的变量在哪里并不重要。
-
这能回答你的问题吗? Still reachable in valgrind
-
这取决于“一些内存”是分配堆栈还是堆。
-
如果您
abort,程序以绝对最少的清理结束。操作系统将回收它所知道的资源,但任何花哨的东西,比如将机械臂重新定位为安全默认值的 C++ 析构函数,都不会执行。exit做了更多工作并刷新流,调用具有静态存储持续时间的对象的析构函数,但不会展开堆栈,这在 C++ 中通常很重要。无论哪种情况,Valgrind 都可能会非常沮丧并记录许多内存错误。 -
我让操作系统在程序退出时锁定了一个共享内存块,这样其他程序就不能使用它了。必须删除共享内存块并重新创建它是唯一的方法。如果您不能使用 RAII,使用 en.cppreference.com/w/cpp/utility/program/atexit 注册您的清理功能会有所帮助。 RAII 显然是您可以做的最好的事情,以确保一切都得到妥善清理。