【问题标题】:Valgrind - What pointers are considered valid at program exit to mark memory as "still reachable"?Valgrind - 在程序退出时哪些指针被认为是有效的,以将内存标记为“仍然可以访问”?
【发布时间】: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 显然是您可以做的最好的事情,以确保一切都得到妥善清理。

标签: c++ c valgrind


【解决方案1】:

我有一些时间,所以我决定自己检查一下。

如果你从mainreturn,Valgrind 认为只有在main 中的局部变量指向的内存“肯定会丢失”,大概是因为main 的所有局部变量都从调用堆栈中弹出在程序退出之前。

另一方面,如果您通过调用exit_Exitabortpthread_exit(即使您从main 调用它们)退出,则main 函数中的局部变量内的指针仍然被认为存在,因此该内存被认为是“仍然可以访问的”。

【讨论】:

    猜你喜欢
    • 2015-08-03
    • 2023-03-29
    • 2011-05-23
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多