gpt4 book ai didi

c++ - 在运行时管理共享库之间的 Boost::any

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:55:10 24 4
gpt4 key购买 nike

我正在制作一个 C++ 框架,该框架应该管理单独构建的自定义模块,这些模块在运行时作为共享库加载。这些模块必须使用自定义数据相互通信,因此我使用了一个包含 boost::any 值的 unordered_map,每个模块都可以使用这些值来设置和读取数据。

在对象的销毁顺序发生小的变化后,该程序最近开始在关闭时出现段错误。经过一些跟踪,我想我发现了错误:即使保存所有共享数据的 unordered_map 由框架保留,每个 boost::any 包含由驻留在共享库中的代码(必然)创建的值,因为框架不知道编译期间每个键将包含什么值/类型。

如果我在取消分配映射之前卸载所有共享库,boost::any 会在销毁时生成段错误,因为(我想)包含其值的指针已经从内存中卸载。如果我先删除 map ,然后取消分配所有模块,则不会显示任何错误。因此,我假设当一个 boost::any 值被创建和填充时,它的内容以某种方式被分配到与共享库关联的一些内存上,并且当共享库关闭时试图删除 boost::any 会使一切崩溃。

std::unordered_map<std::string, boost::any> shared_data;
std::vector<Module> dynamically_loaded_modules;

// RUNTIME DURING SOME MODULE EXECUTION
shared_data["SomeKey"] = my_unknown_typed_data;

// ON PROGRAM EXIT
dynamically_loaded_modules.clear(); // Calls dlclose()
shared_data.clear(); // This crashes
// ---------------
shared_data.clear();
dynamically_loaded_modules.clear(); // This does not crash

我的问题如下:

  • 我对正在发生的事情的解释是否真实可行?我不太了解 dlfcn.h 如何管理共享库
  • 先解除映射再解除模块安全吗?或者我应该有办法让模块明确删除它们创建的每个 boost::any 吗?我什至需要这样做吗?

最佳答案

您是否收到“访问违规读取位置 __vfptr”的消息?如果是这样,我认为以下陈述可以解释发生了什么以及为什么。假设 map 是在 sharedlibrary.dll 中创建的,然后在 userclient.dll 中 push 一个 boost::any 对象在 map 中。any对象存储数据,类型为int。然后创建一个新的模板类类型boost::any::holder 。boost::any::holder 的析构函数地址在userclient.dll的范围内地址。

好了,现在一切都清楚了,你卸载userclient.dll,userlcient.dll的地址是无效的。最后,你销毁sharedlirary.dll中的map,应该调用boost::any::holder 对象的析构函数,但是boost::any::holder 析构函数的地址无效,因为userlicnet.dll被卸载了已经。然后你会看到“访问违规读取位置__vfptr”的消息。

关于c++ - 在运行时管理共享库之间的 Boost::any,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20765816/

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