发布版本中的行为我无法理解

时间:2013-06-26 05:00:34

标签: c++ boost

在尝试找出仅在发布版本中而不是在调试版本中发生的问题时,我注意到以下行为(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期间完全找到。我通过引用不返回共享指针解决了这个问题。在这种情况下,它可以工作。为什么删除引用使其工作

1 个答案:

答案 0 :(得分:0)

您的shared_cls t超出了范围,因为它是在函数SomeMethod中定义的。如果在作用域中定义了共享指针,则需要按值返回共享指针。在link中,解释了为什么返回临时对象的引用是危险的。

在std :: string的情况下,string具有引用计数机制,并且当它的引用递减到零时,它变为无效并且在这种情况下可能观察到分段错误。即使成员int i被正确返回,它仍然是未定义的行为。