我正在制作一个C ++框架,它应该管理单独构建的自定义模块,这些模块在运行时作为共享库加载。这些模块必须使用自定义数据相互通信,因此我使用的是包含boost :: any值的unordered_map,每个模块可以使用这些值来设置和读取数据。
在对象的破坏排序发生微小变化后,程序最近开始在关闭时出现段错误。在进行一些跟踪之后,我认为我发现了错误:即使包含所有共享数据的unordered_map由框架保留,每个boost :: any包含由(共享)驻留在共享库中的代码创建的值,因为框架不知道每个键在编译期间将包含哪些值/类型。
如果在解除分配映射之前卸载所有共享库,会发生什么情况,boost :: any会在销毁时生成段错误,因为(我想)包含其值的指针已经从内存中卸载了。如果我首先删除地图然后取消分配所有模块,则不会显示错误。因此我假设当一个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
我的问题如下:
答案 0 :(得分:0)
您是否收到了#34;访问违规读取位置__vfptr&#34;的消息? 如果是这样,我认为过时的陈述可以解释发生了什么以及为什么。 假设map是在sharedlibrary.dll中创建的,然后在userclient.dll中的地图中推送一个boost :: any对象。 任何对象存储的数据类型为int。然后一个新的模板类类型boost :: any :: holder&lt; int&gt;是创建的.prot :: any :: holder&lt;的地址int&gt;析构函数在userclient.dll的地址范围内。
好的,现在一切都很清楚,你卸载userclient.dll,userlcient.dll的地址无效。最后,你在sharedlirary.dll中销毁地图,boost :: any :: holder&lt; int&gt;应该调用object的destrctutor,但是boost :: any :: holder&lt;的地址int&gt;析构函数对userlicnet.dll无效已卸载。然后你会看到&#34;访问违规读取位置__vfptr&#34;的消息。