компилятор не завершает sh процесс - PullRequest
2 голосов
/ 22 апреля 2020

У меня есть мультикарта, ключ которой короткий, а значением является другая мультикарта

std::multimap<short,std::multimap<short,short>> multimap

Теперь я хочу это сделать`

std::multimap<short,short> &a=multimap.find(0)->second;
std::pair<short,short> z={1,2};
a.insert(z);

Он компилируется нормально. Но когда я запускаю его, он просто останавливается и не завершает sh процесс, он даже не выдает ошибку времени выполнения. Есть идеи? Спасибо за совет.

Ответы [ 2 ]

6 голосов
/ 22 апреля 2020

Имея

std::multimap<short,std::multimap<short,short>> multimap
...
std::multimap<short,short> &a=multimap.find(0)->second;
std::pair<short,short> z={1,2};
a.insert(z);

Если find возвращает multimap::end, то один не должен быть разыменован, но вы делаете и получаете ссылку на second, поведение не определено, когда позже использовать эту ссылку на insert.

Так что, конечно, проверьте, если find успешно, например

  std::multimap<short,std::multimap<short,short>> multimap;
  std::multimap<short,std::multimap<short,short>>::iterator it = multimap.find(0);

  if (it == multimap.end()) {
    ...
  }
  else {
    std::multimap<short,short> &a = it->second;

    std::pair<short,short> z={1,2};
    a.insert(z);
  }

Из этого вашего названия "компилятор не завершает sh процесс" не очень понятно, выполнение не то, что вы ожидаете, но компилятор не запускает процесс

2 голосов
/ 22 апреля 2020

Если multimap не имеет элемента с ключом 0, то multimap.find(0) возвращает итератор, который не может быть разыменован. Всегда проверяйте возвращаемые значения таких вызовов перед разыменованием итератора.

auto iter = multimap.find(0);
if ( iter != multimap.end() )
{
   std::multimap<short,short> &a = iter->second;
   std::pair<short,short> z={1,2};
   a.insert(z);
}
else
{
   // Decide what to do
}
...