0

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

4

1 回答 1

0

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

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

于 2013-06-26T05:08:54.123 回答