2014-02-07 34 views
0

我正在使用Visual Studio 2012(标准C++,无/ clr支持)在C++中编写模拟项目,我面临以下问题。通过引用传递后的字符串更改

theClassObject->Method("12345") 

其中在类的方法的定义是:: 在代码某处我通过引用传递字符串

TheClass::Method(const std::string& STR) {..} 

,当我调试它具有在检查STR的值前面还有四个字节,例如“〜#.a12345”,字符串的长度增加了这四个字节。 在其他地方的代码与其他类似的方法,这不会发生。

我错过了该项目的一些编译器选项,或者我错过了其他原因?

我不确定我是否提供了所需的所有信息,但如果需要,我可以提供。

在此先感谢!

+2

这不应该发生。从你发布的内容来看,几乎不可能猜测哪里出了问题。你能把你的问题减少到一个仍然可以编译的子集吗? – nvoigt

+0

您正在将它作为const引用发送,因此您不能更改函数Method()内部的字符串,它正在其他地方更改。你能发表一个样本工作代码吗?(SSCCE) – vathsa

+0

这很奇怪......你正在改变一个const引用!发布'TheClass :: Method(const std :: string&STR)'的实现。它可能是一个显示错误值的调试配置。 –

回答

2

这个嘎嘎声就像一个模块边界问题,调用另一个DLL中的代码,它是用std :: string或不兼容的编译器设置的不兼容版本构建的。像_HAS_ITERATOR_DEBUGGING一样。

唯一的解决方法是重新编译所有的东西与完全相同的编译器版本,C++库和构建设置。

跨越模块边界暴露C++对象是一种危险的冒险。尤其是std命名空间中的那些,特别是最近C++ 11为标准库实现带来了重大变化。真正无故障的DLL接口需要非常严格的措施,这种看起来很像COM。

相关问题