gpt4 book ai didi

c++ - 我可以在卸载 DLL 后存储在 DLL 中创建的对象吗?

转载 作者:搜寻专家 更新时间:2023-10-31 01:47:58 24 4
gpt4 key购买 nike

我需要对以下代码进行一些说明。

在下面的代码中,我从 DLL 中检索接口(interface)的私有(private)实现。

卸载 DLL 后(案例 #2),从界面检索的字符串和界面本身都变得无效,并且在访问它们时发生(预期的)访问冲突。

但让我感到困惑的是,当我重新加载 DLL 时,我可以再次使用接口(interface)和字符串,而无需从 DLL 中重新检索它们。

这应该以这种方式工作吗?

怎么内存都失效了,DLL再次加载后突然又有效了?

这是否只是运气,由于我的测试程序相对简单,DLL 第二次方便地加载到内存中完全相同的位置?

int main(int argc, int *argv[])
{
Interface *itf;
const char *name;

{
// loads the dll and gets functions
PersistenInterface pi("PersistentInterface.dll");

// returns a private implementation of the interface
itf = pi.CreateInterface();
name = itf->GetName();

// CASE #1
cout << name << endl; // suceeds

} // dll is unloaded in ~PersistenInterface()

// CASE #2
//cout << name << endl; // crashes
//cout << itf->GetName() << endl; // crashes

{
PersistenInterface pi("PersistentInterface.dll");

// CASE #3
cout << name << endl; // suceeds !?
cout << itf->GetName() << endl; // suceeds !?
}

return 0;
}

最佳答案

我希望您不会从 DLL 返回堆栈上的本地对象。它肯定会使您的系统崩溃,因为本地对象在函数从 DLL 返回后被销毁。它与DLL的概念无关。如果您尝试在其包含函数返回后引用本地对象,您将看到同样的问题。

如果内存是在DLL内部的堆上动态分配的,那么在DLL未初始化后它仍然有效。您仍然可以在主应用程序中使用内存,因为 DLL 本身不拥有任何东西。请记住,堆属于进程,而不是 DLL。

但是,一般规则是该内存的所有者(创建该内存的人,例如您的情况下的 DLL)负责释放相同的内存。在 DLL 中分配内存并在另一端释放它可能会给您带来不必要的麻烦,如果两侧使用不同的 CRT 实例,例如

关于c++ - 我可以在卸载 DLL 后存储在 DLL 中创建的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18565808/

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