2014-02-07 3 views
0

Visual Studio 2012 (표준 C++ 및/clr 지원 없음)를 사용하여 C++에서 시뮬레이션 프로젝트를 작성 중이며 다음 문제가 발생합니다.참조로 전달한 후 문자열이 변경됨

theClassObject->Method("12345") 

클래스에있어서의 정의는 : 코드에 어딘가에 I 참조하여 문자열을 전달

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

그리고 그것이 가지고 디버깅 동안 STR 값을 확인할 때 예를 들어 "~ # .a12345"와 같이 앞에 4 바이트가 더 늘어나고이 4 바이트만큼 문자열의 길이가 늘어납니다. 다른 유사한 방법을 사용하는 코드의 다른 위치에서는 이것이 발생하지 않습니다.

프로젝트에 대한 일부 컴파일러 옵션이 누락되었거나 놓친 다른 이유가 있습니까?

필요한 모든 정보를 제공했는지 확신 할 수 없지만 필요할 경우 할 수 있습니다.

미리 감사드립니다.

+2

이렇게해서는 안됩니다. 게시 한 내용부터 무엇이 잘못되었는지를 추측하는 것은 거의 불가능합니다. 문제를 여전히 편집 가능하고 게시 할 수있는 하위 집합으로 줄일 수 있습니까? – nvoigt

+0

당신은 const 참조로 보내므로, Method() 함수 내에서 문자열을 변경할 수 없습니다. 다른 곳에서 변경되고 있습니다. 샘플 작업 코드를 게시 할 수 있습니까? (SSCCE) – vathsa

+0

이상한 ... const 참조를 변경하고 있습니다! 'TheClass :: Method (const std :: string & STR)'의 구현을 게시하십시오. 아마도 잘못된 값을 보여주는 디버그 구성 일 것입니다. –

답변

2

호환되지 않는 버전의 std :: string 또는 호환되지 않는 컴파일러 설정으로 작성된 다른 DLL에서 코드를 호출하여 모듈 경계 문제와 크게 관련됩니다. _HAS_ITERATOR_DEBUGGING처럼.

정확히 동일한 컴파일러 버전, C++ 라이브러리 및 빌드 설정으로 다시 컴파일해야합니다.

모듈 경계를 넘어 C++ 객체를 노출하는 것은 위험한 모험입니다. 특히 std 네임 스페이스에 있고 특히 C++ 11에서 표준 라이브러리 구현을 크게 변경했습니다. 정말로 문제없는 DLL 인터페이스는 COM과 매우 흡사하게 보이는 매우 까다로운 조치를 필요로합니다.

관련 문제