我有一个相当大的代码库,它是高度模块化的(很多很多插件),并且经常需要在模块之间传递字符串等.供参考,代码:
现在,我的印象是,如果库或编译器versio发生更改,在模块之间传递STL对象确实会破坏.特别是当涉及到dtors并销毁模块/版本之外的对象时,它们就是在其中创建的.
MFC是否更安全?你能CString安全地将一个MFC对象(例如)从Base.dll传递给Plugin.dll吗?你必须传递一个指针,你不能安全地从插件中删除它吗?
MFC是否静态链接或从DLL使用是否重要?
MSDN在一些地方提到:
常规DLL中的所有内存分配都应保留在DLL中; DLL不应传递给调用可执行文件或从其接收以下任何一项:
- 指向MFC对象的指针
- 指向MFC分配的内存的指针
如果您需要执行上述任何操作,或者您需要在调用可执行文件和DLL之间传递MFC派生的对象,则必须构建扩展DLL.
但是,页面扩展DLL提到它们主要用于从MFC对象派生的实现对象.我没有兴趣这样做,只是使用它们并在各种模块之间传递.
传递shared_ptrs会改变任何东西(或带有虚拟dtor的类)吗?
如果没有诉诸C类型,是否有解决方案?
扩展 DLL 将与应用程序和任何其他扩展 DLL 共享 MFC DLL,以便对象可以在它们之间自由传递。Microsoft 可能希望扩展 DLL 来实现扩展类,但这不是必需的 - 您可以以任何您想要的方式使用它。
标准库最大的危险在于它的大部分内容都是基于模板的。这是危险的,因为如果 DLL 和应用程序是使用不同版本的模板构建的,那么您将违反“单一定义规则”运行,并且未定义的行为会在后面咬您一口。这不仅仅是对象的初始化或销毁,而是针对对象的任何操作!