2013-06-26 1 views
0

릴리스 빌드에서만 발생하고 디버그 빌드에서 발생하지 않는 문제를 찾으려고 할 때 다음과 같은 동작이 나타났습니다 (문자열은 유효하지 않으며 int를 가리키는 동안 아무 것도 가리 키지 않음). 괜찮아요.) 나는 내가릴리스 빌드의 동작 내가 이해할 수 없음

typedef boost::shared_ptr<MyClass> shared_cls 
typedef std::deque<shared_cls> vector_def; 
typedef boost::shared_ptr<vector_def> shared_vector_def; 
typedef boost::unordered_map<int,shared_vector_def> inner_map_def; 
typedef boost::shared_ptr<inner_map_def> shared_inner_map_def; 
static boost::unordered_map<std::string,shared_inner_map_def> bcontainer; 

shared_cls& SomeMethod(const std::string& symb,const int& no) 
{ 
    shared_inner_map_def tshare = bcontainer[symb]; 
    shared_vector_def tmp = tshare->at(no); 
    shared_cls t = tmp->back(); 
    return t 
} 

나는 다음과 같은 코드와 같이 위의 방법을 사용할 때 객체 MyClass에 지금이

 class SomeClass 
     { 
      private: 
      int i; 
      std::string s; 
      void set_i(int rx) 
      { 
      i = rx; 
      } 
      int get_i() 
      { 
       return i; 
      } 
      void set_s(std::string rx) 
      { 
      s = rx; 
      } 
      std::string get_s() 
      { 
       return s; 
      } 
     } 

처럼 보이는 통해 무슨 일이 있었는지의 아이디어를 제공하는 아래의 코드를 준

void main() 
{ 
    shared_cls r = SomeMethod("IBM",12); 
    //Here r does not have a valid string s 
    //However it does have a valid int i 
} 

내 질문에 위의 main 내가 SomeMethod 호출 할 때 반환 된 r 유효한 문자열이 s 없습니다. 그것은 로거 (logger)를 사용하여 발견 한 가치가 있습니다. 그러나 s의 값은 함수 SomeMethod 중에 완전히 발견됩니다. 참조로 공유 포인터를 반환하지 않음으로써이 문제를 해결했습니다.이 경우에는 작동합니다. 참조 제거로 인해 작동하지 않는 이유는 무엇입니까

+2

임시 개체에 대한 참조를 반환하려고하면 괜찮은 컴파일러에서 대담한 경고를 받아야합니다! –

+0

포인터가 정적 컨테이너에있는 개체를 가리 키지 않습니다. – MistyD

+0

@MistyD, 게시 된 코드가 완전하지 않은 것 같습니다 –

답변

0

shared_cls tSomeMethod 자체에서 정의 되었기 때문에 범위를 벗어납니다. 공유 포인터가 범위에서 정의 된 경우 공유 포인터를 값으로 반환해야합니다. link에는 임시 개체의 참조를 반환하는 것이 위험한 이유가 설명되어 있습니다.

std :: string의 경우 string에는 참조 카운팅 메커니즘이 있으며 참조가 0으로 감소 할 때 해당 문자열은 무효화되고 이러한 경우 세그먼트 오류가 관찰 될 수 있습니다. 멤버 int i이 제대로 반환 되더라도 여전히 정의되지 않은 동작입니다.

+0

그렇다면 왜 int 값이 있고 문자열 만 손상 되었습니까? – MistyD

+1

정의되지 않은 동작 때문에. –

관련 문제