gpt4 book ai didi

c++ - 在动态加载的库中我的内存分配在哪里?

转载 作者:太空狗 更新时间:2023-10-29 21:20:23 24 4
gpt4 key购买 nike

我也想了很久。。根据这张表: http://ilay.org/yann/articles/mem/process_map.png (对不起它的法语部分)内存分配在不同的内存空间中,具体取决于程序的哪一部分正在分配它。

因此,如果我在我的程序中创建一个对象,它将在程序中分配。如果动态分配内存,它将在堆中,以及动态加载对象的“链接”。

我的问题是:从动态加载的库中动态分配的内存属于哪里?

如果我有包含这个的库:

extern "C" Object* create_Object()
{
return new Object();
}

class Object
{
int a;
int* b;
...
}

我的对象是在堆中分配还是在链接中分配?

我猜是堆,但我有一段代码让我怀疑它。我正在开发一个 Cpp 脚本系统,我的脚本被编译为共享库,加载到我的程序中,并在每次必须重新编译脚本时重新加载。我的想法是在卸载它们之前保存我的脚本的状态,并在动态加载对象的新实例中恢复它们的内容。如果我动态加载对象的字段映射到堆中,保存指向数据的指针就足够了,但是如果创建的类分配在内存的“链接”段中,那么当我恢复内容时,我的指针将指向在未分配的内存上,这将使我的程序完全不稳定,就是这种情况......

所以我不知道。我的“对象”实例在内存中的哪个位置? “a”在哪里,不是动态分配的?在我的示例中,如果我动态分配它,“b”的内容会在哪里?

我希望无论在何处调用 new,new 都会在堆中分配,并且 Object 中的变量 a 和 b 也会在堆中分配,因为它是从动态分配的对象实例化的,但它是只是猜测,我想确定...

我还想知道一旦我 dlclose 我的共享库,我的 Object 实例会发生什么。再一次,如果它在堆中,我访问我的对象应该没有任何问题,但由于我没有符号,我猜该对象将被分配但非常不可行,因为我无法解析它的成员.

我希望你能帮助我 =)

最佳答案

我认为对象数据安全地存储在堆上,即使在 dlclose() 之后(除非更改了 C++ 动态空间分配器)。

但是您肯定会在调用虚拟方法时遇到问题。虚拟表将指向不再可用的文本区域。而且 C++ 不提供重新绑定(bind)虚拟方法的方法;我不知道。

如果你真的需要,你可以:

  1. 将您的类定义更改为struct
  2. 将所有虚方法声明为该结构内的指针;
  3. 让您的加载/卸载例程提供绑定(bind)(即,为每个已分配对象中的每个指针分配每个实际函数)。

当然,您将跟踪所有对象实例。当然你可以有一个指针,指向一个表,表本身由库提供;不过,这个单个指针仍必须手动反弹。

关于c++ - 在动态加载的库中我的内存分配在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24634898/

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