2013-06-26 19 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。它具有我通過使用記錄器發現的混亂值。但s的值在功能SomeMethod中完全找到。我通過不通過引用返回共享指針來解決此問題。在這種情況下,它可以工作。爲什麼刪除參考使其工作

+2

當你嘗試返回一個臨時對象的引用時,你應該從任何體面的編譯器得到一個大膽的警告! –

+0

不是指向指向靜態容器中存在的對象的指針。 – MistyD

+0

@MistyD,看起來你的發佈代碼不完整 –

回答

0

您的shared_cls t超出範圍,因爲它在函數SomeMethod本身中定義。如果在範圍中定義它們,您需要按值返回共享指針。在link中,解釋了爲什麼返回臨時對象的引用是危險的。

在std :: string的情況下,string有一個引用計數機制,當它的引用減少到零時,它就會失效,並且在這種情況下可能會出現分段錯誤。即使成員int i被正確地返回,它仍然是未定義的行爲。

+0

那麼,爲什麼int值會在那裏,只有字符串被破壞? – MistyD

+1

由於未定義的行爲。 –

相關問題