在尝试找出仅在发布版本中而不是在调试版本中发生的问题时,我注意到以下行为(String将无效,并且在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
。它有一个混乱的值,我通过使用记录器找到了这一点。但是,s
的值在函数SomeMethod
期间完全找到。我通过引用不返回共享指针解决了这个问题。在这种情况下,它可以工作。为什么删除引用使其工作
答案 0 :(得分:0)
您的shared_cls t
超出了范围,因为它是在函数SomeMethod
中定义的。如果在作用域中定义了共享指针,则需要按值返回共享指针。在link中,解释了为什么返回临时对象的引用是危险的。
在std :: string的情况下,string具有引用计数机制,并且当它的引用递减到零时,它变为无效并且在这种情况下可能观察到分段错误。即使成员int i
被正确返回,它仍然是未定义的行为。