gpt4 book ai didi

c++ - 在 dlclose() 之后访问由共享库分配的内存

转载 作者:太空狗 更新时间:2023-10-29 20:55:11 25 4
gpt4 key购买 nike

在做了一些研究之后,我终于转向 SO 来问我的问题:在使用 malloc() 关闭库后,共享库(使用 newdlclose() )动态分配的内存会发生什么情况| ?我观察到的行为是对此类内存的任何访问(取消引用它,使用 delete 运算符等)都会导致段错误。它在某处定义了吗?

当我知道调用 dlclose() 时,现在问这个问题似乎是个愚蠢的问题在我完成内存之前是错误的来源 - 通过使用 delete 触发new 上的运算符(operator)-created object received from a shared library - 最近几天我一直在苦苦挣扎,但我想知道为什么,而不是仅仅猜测以防我将来遇到类似情况。

最佳答案

what happens to the memory allocated by a shared library after the library is closed with dlclose().

取决于您所说的“分配”是什么意思。

至少要考虑三种情况:

  1. 使用mallocnew 分配内存。 dlclose无效
  2. 库中的全局变量。 dlclose() 可能 munmap() 内存(或不;取决于是否使用了库中的其他符号)。如果确实发生了 munmap,内存将完全无法访问。
  3. 库创建一个全局对象(例如全局 std::string)。该对象使用 ::new(就像 string 那样)为自己分配内部存储空间。当库dlclosed 时,对象可能 被破坏。如果它被破坏,它将::delete那段内存。内存可能仍然可以访问,但访问它会调用未定义的行为(就像对悬空内存的任何其他访问一样)。

更新:

对于情况 #1,d 内存仍然可以访问。但是 newd 对象中的任何嵌套 指针可能不是。在 C++ 中,如果对象有虚函数,虚表指针可能变得不可访问(它指向现在卸载的 foo.so 中的只读数据),这case 等同于#2。

Do you have any clues I should follow to find out what went wrong?

是的:使用通常的调试技术:在 GDB 下运行程序,找出崩溃的位置。如果您仍然无法理解崩溃,请使用一些代码来编辑您的问题,这些代码可以显示程序正在做什么,以及 GDB 的输出。

关于c++ - 在 dlclose() 之后访问由共享库分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36524043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com