在运行时管理Boost::任意共享库 我正在制作一个C++框架,它应该管理单独构建的自定义模块,这些模块在运行时作为共享库加载。这些模块必须使用自定义数据相互通信,因此我使用一个无序的_映射,其中包含boost::每个模块可以用来设置和读取数据的任何值
该程序最近开始在关闭时给出一个segfault错误,原因是对象的销毁顺序发生了一个小的变化。经过一些跟踪,我认为我发现了错误:尽管框架保留了保存所有共享数据的无序_映射,但每个boost::any都包含由驻留在共享库中的代码创建的值(必须),因为框架不知道每个键在编译期间将包含哪些值/类型在运行时管理Boost::任意共享库 我正在制作一个C++框架,它应该管理单独构建的自定义模块,这些模块在运行时作为共享库加载。这些模块必须使用自定义数据相互通信,因此我使用一个无序的_映射,其中包含boost::每个模块可以用来设置和读取数据的任何值,c++,memory-management,boost,segmentation-fault,shared-libraries,C++,Memory Management,Boost,Segmentation Fault,Shared Libraries,该程序最近开始在关闭时给出一个segfault错误,原因是对象的销毁顺序发生了一个小的变化。经过一些跟踪,我认为我发现了错误:尽管框架保留了保存所有共享数据的无序_映射,但每个boost::any都包含由驻留在共享库中的代码创建的值(必须),因为框架不知道每个键在编译期间将包含哪些值/类型 如果在解除分配映射之前卸载所有共享库,那么boost::any在销毁时会生成一个segfault,因为(我想)包含其值的指针已经从内存中卸载了。如果我先删除映射,然后取消分配所有模块,则不会出现错误。因此,我
如果在解除分配映射之前卸载所有共享库,那么boost::any在销毁时会生成一个segfault,因为(我想)包含其值的指针已经从内存中卸载了。如果我先删除映射,然后取消分配所有模块,则不会出现错误。因此,我假设当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
std::无序地图共享数据;
std::向量动态加载的模块;
//在某些模块执行期间运行
共享的\u数据[“SomeKey”]=我的\u未知\u类型的\u数据;
//关于程序退出
动态加载的模块。清除();//调用dlclose()
共享_数据。清除();//这个崩溃了
// ---------------
共享_数据。清除();
动态加载的模块。清除();//这不会崩溃
我的问题如下:
- 我对正在发生的事情的解释现实可行吗?我对dlfcn.h如何管理共享库不太了解
- 释放地图和模块是否安全?或者我应该有办法让模块显式删除它们创建的每个boost::any吗?我需要这样做吗
好的,现在一切都清楚了,如果卸载userclient.dll,userlcient.dll的地址无效。最后,在SharedLiAry.dll中销毁映射时,应该调用boost::any::holder