릴리스 빌드에서만 발생하고 디버그 빌드에서 발생하지 않는 문제를 찾으려고 할 때 다음과 같은 동작이 나타났습니다 (문자열은 유효하지 않으며 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
중에 완전히 발견됩니다. 참조로 공유 포인터를 반환하지 않음으로써이 문제를 해결했습니다.이 경우에는 작동합니다. 참조 제거로 인해 작동하지 않는 이유는 무엇입니까
임시 개체에 대한 참조를 반환하려고하면 괜찮은 컴파일러에서 대담한 경고를 받아야합니다! –
포인터가 정적 컨테이너에있는 개체를 가리 키지 않습니다. – MistyD
@MistyD, 게시 된 코드가 완전하지 않은 것 같습니다 –