1

C++ でマルチマップを使用しようとしています。主な目的は、マルチマップ ポインターを格納するマップがあることです。

マルチマップに挿入しようとすると、問題が発生します。誰かが私がどこで間違っているのか教えてもらえますか?

typedef multimap<int,int> mm;
typedef map<int,mm*> v_map;

int main()
{
v_map map1;

v_map::iterator it;
it = map1.find(23);

mm *mm_map_pointer;

if( it == map1.end())
  {
   mm m_map1; 
   map1[23] = &m_map1;
   mm_map_pointer = &m_map1;
  }
else
 {
   mm_map_pointer = it->second; 
 }

mm_map_pointer->insert( pair<int, int>(1, 2));
return 0;
}

問題は mm_map_pointer->insert( pair(1, 2)); にあります。誰か助けてくれませんか?

4

2 に答える 2

5
{
 mm m_map1; 
 map1[23] = &m_map1;
 mm_map_pointer = &m_map1;
} // end of scope

あなたの問題はm_map1、範囲外になり、破棄され、ぶら下がっているポインターが残ることです。

于 2011-04-26T15:52:06.360 に答える
5

あなたm_map1はローカル変数であり、それへのポインターをあなたのに格納しようとしていますmap。これにより、その変数を含むブロックが終了すると、ダングリング ポインターが発生します。

これを解決するには、次の 2 つの方法があります。

  • 私の好みの方法は、を直接格納するmultimapことですmap(つまり、ポインタを使用しません)。おまけとして、これによりコードが大幅に簡素化されます。

    typedef multimap<int, int> mm;
    typedef map<int, mm> v_map;
    
    v_map map1;
    map1[23].insert(make_pair(1, 2));
    

    それでおしまい!

  • 他のオプションはnew、 の永続的なコピーを作成するために使用することmultimapです。この場合、手動で割り当てを解除する必要がないように、mapを保持する必要があります。shared_ptr<multimap<...> >multimap

于 2011-04-26T15:52:23.343 に答える