我正在使用Visual Studio 2012(没有/ clr支持的标准C ++)用C ++编写一个模拟项目,我遇到了以下问题。 在代码的某处,我通过引用传递一个字符串:
theClassObject->Method("12345")
其中类中方法的定义是:
TheClass::Method(const std::string& STR) {..}
当我在调试期间检查STR的值时,前面还有四个字节,例如“〜#.a12345”,字符串的长度增加了这四个字节。 在其他类似方法的代码的其他地方,这不会发生。
我是否错过了该项目的某些编译器选项,或者还有其他原因我错过了?
我不确定我是否提供了所需的所有信息,但如果需要我可以。
提前致谢!
答案 0 :(得分:2)
这就像模块边界问题一样大声嘎嘎叫,调用另一个用不兼容的std :: string版本或不兼容的编译器设置构建的DLL中的代码。和_HAS_ITERATOR_DEBUGGING一样。
唯一的解决方法是使用完全相同的编译器版本,C ++库和构建设置重新编译所有。
跨模块边界公开C ++对象是一次危险的冒险。特别是std命名空间中的那些,尤其是最近的C ++ 11,它给标准库实现带来了很大的变化。真正无故障的DLL接口需要非常严格的措施,这种措施看起来很像COM。