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
}

今、私の質問は、返さmainSomeMethodた r に有効な文字列がありませんs。ロガーを使用してこれを見つけたスクランブルされた値があります。ただし、 の値はs関数中に完全に見つかりますSomeMethod。参照によって共有ポインタを返さないようにすることで、この問題を解決しました。その場合は機能します。参照を削除すると機能するのはなぜですか

4

1 に答える 1