Mae*_*ael 4 c++ linux memory-management shared-libraries
在做了一些研究之后,我终于转向 SO 来问我的问题:共享库(使用malloc()或new)动态分配的内存在共享库关闭后会发生dlclose()什么?我观察到的行为是对此类内存的任何访问(取消引用它,使用delete运算符等)都会导致分段错误。它是在某处定义的吗?
现在这似乎是一个愚蠢的问题,当我知道dlclose()在我完成内存之前调用是错误的来源 - 通过delete在new从共享库接收的-created 对象上使用运算符触发- 我一直在努力争取最近几天,但我想知道为什么,而不是只是猜测,以防我将来遇到类似的情况。
库关闭后共享库分配的内存会发生什么
dlclose()。
这取决于您所说的“已分配”是什么意思。
至少需要考虑三种情况:
malloc或分配内存new。dlclose不会有任何影响。dlclose() 可能 munmap()是内存(或不是;取决于是否使用了库中的其他符号)。如果munmap确实发生,内存将完全无法访问。std::string)。该对象使用::new(如string将)为自己分配内部存储。当库为dlclosed 时,对象可能会被破坏。如果它被破坏了,它就会::delete记忆。内存可能仍然可以访问,但访问它会调用未定义的行为(就像对悬空内存的任何其他访问一样)。更新:
对于案例#1,newd 内存仍然可以访问。但是该d 对象中的任何嵌套指针new可能不是。在 中C++,如果对象具有虚函数,则虚表指针可能变得不可访问(它指向 now unloaded 中的只读数据foo.so),这种情况就相当于#2。
你有什么我应该遵循的线索来找出问题所在吗?
是的:使用通常的调试技术:在 GDB 下运行程序,找出它到底在哪里崩溃。如果您仍然无法理解崩溃,请使用一些显示程序正在执行的操作和 GDB 输出的代码编辑您的问题。