还有两个“潜在错误”(除其他外)您必须小心,因为它们与语言“下”的内容有关。
首先是 std::strng 是一个模板,因此它在每个翻译单元中被实例化。如果它们都链接到同一个模块(exe 或 dll),链接器会将相同的函数解析为相同的代码,最终不一致的代码(具有不同主体的相同函数)被视为错误。
但是,如果它们链接到不同的模块(以及 exe 和 dll),则没有任何共同点(编译器和链接器)。因此 - 根据模块的编译方式 - 您可能对具有不同成员和内存布局的同一类有不同的实现(例如,一个可能有一些调试或分析添加的功能,而另一个没有)。使用在另一侧编译的方法访问在一侧创建的对象,如果您没有其他方法来授予实现一致性,可能会以泪水告终。
第二个问题(更微妙)与内存的分配/释放有关:由于 windows 的工作方式,每个模块都可以有一个不同的堆。但是标准的 C++ 并没有指定如何new
以及delete
关心对象来自哪个堆。如果字符串缓冲区是在一个模块上分配的,而不是移动到另一个模块上的字符串实例,则可能(在销毁时)将内存归还给错误的堆(这取决于如何new/delete
以及如何malloc/free
实现HeapAlloc/HeapFree
:这仅涉及STL实现对底层操作系统的“意识”级别。操作本身不是破坏性的——操作只是失败了——但它会泄漏源的堆)。
综上所述,通过容器并非不可能。由于编译器和链接器无法交叉检查,因此您可以在双方之间授予一致的实现。