Использование auto вместо map & lt; string, int & gt; :: iterator дает утечку памяти, у кого-нибудь есть идея, почему?

Вот код с утечкой: http://codeforces.com/contest/43/submission/40769170

глючная часть:

auto one = mymap.begin();
auto two = mymap.begin();
two++;
if ((*one).second > (*two).second){
temp = (*one).first;
}else{
temp = (*two).first;
}

Странные решения, которые сработали:

Не использовать авто:
http://codeforces.com/contest/43/submission/40770335

map<string,int>::iterator one = mymap.begin();
map<string,int>::iterator two = mymap.begin();
two++;

объявление карты и строки как глобальных переменных:
http://codeforces.com/contest/43/submission/40769802

map<string,int> mymap;
string temp;
int main() {...}

-2

Решение

Я думаю, что вы испытываете неопределенное поведение. Таким образом, может произойти все, что угодно, утечка памяти, сбой или просто работа. Посмотреть здесь:

auto one = mymap.begin();
auto two = mymap.begin();
two++;
if ((*one).second > (*two).second){
// ...
}

two начинается как итератор первого элемента на карте, который затем увеличивается до второго элемента на карте. Затем вы разыменовываете этот итератор.

Но что, если только одна команда забьет, как в первом тестовом случае? В этом случае на карте будет только один элемент. Поэтому, когда вы увеличиваете two это будет равно mymap.end(), Разыменование конечного итератора — неопределенное поведение.

Одним из решений было бы проверить, если two равно mymap.end() перед разыменованием:

if (two == mymap.end() || one->second > two->second) {
// ...
}
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector