2014-02-07 58 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。

相關問題