Мультикарты в C ++ - PullRequest
       23

Мультикарты в C ++

1 голос
/ 26 апреля 2011

Я пытаюсь использовать мультикарты в 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));Может кто-нибудь помочь?

Ответы [ 2 ]

5 голосов
/ 26 апреля 2011

Ваш m_map1 является локальной переменной, и вы пытаетесь сохранить указатель на него в вашем map. Это приводит к висячему указателю при выходе из блока, содержащего эту переменную.

У вас есть два способа решить эту проблему:

  • Мой предпочтительный способ - сохранить 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 вручную.

5 голосов
/ 26 апреля 2011
{
 mm m_map1; 
 map1[23] = &m_map1;
 mm_map_pointer = &m_map1;
} // end of scope

Ваша проблема в том, что m_map1 выходит из области видимости и уничтожается, оставляя вас с висящим указателем.

...