Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
IVSasha
6 / 6 / 3
Регистрация: 29.07.2015
Сообщений: 61
1

Почему нет ошибок?

19.09.2015, 15:01. Просмотров 844. Ответов 5
Метки нет (Все метки)

Программа ведь не должна работать

После вызова erase() для элемента, на который ссылается итератор it,
итератор становится недействительным. Любые попытки использования it
после удаления элемента без повторной инициализации - даже команда ++it
- приводят к непредсказуемым последствиям.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
#include <iterator>
 
int main() {
    typedef std::multimap<std::string, float> StringFloatMMap;
 
    StringFloatMMap c;
 
    c.insert(std::make_pair("String1", 1));
    c.insert(std::make_pair("String2", 2));
    c.insert(std::make_pair("String3", 3));
    c.insert(std::make_pair("String4", 4));
    c.insert(std::make_pair("String5", 5));
    c.insert(std::make_pair("String6", 6));
 
    for (StringFloatMMap::iterator it = c.begin(); it != c.end(); ++it)
        if (it->second == 5)
            c.erase(it);
            
    
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2015, 15:01
Ответы с готовыми решениями:

ошибок в компиляции нет, а при работе выходит ошибка, почему?
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; const int n=2; struct a1{ ...

При компилировании компилятор вылетает,нет ли ошибок, или почему он так?
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;iomanip&gt; using namespace std; int main; void...

Почему код не работает хотя ошибок нет? Что-то не так с выделением памяти?
#include &lt;math.h&gt; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace...

Разбираюсь с заданием. Ошибок нет но результата нет
Проштудировал весь форум.Решений много взял по примеру написал код, ошибок нет но ответа нужного...

Проект не запускается, но ошибок нет
1.срр /*Requiries: big.cpp*/ #include &lt;math.h&gt; #include &lt;iostream&gt; #include...

5
Enno
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
19.09.2015, 15:06 2
Не работать тоже не должна.
Ты просто вызываешь оператор префиксного инкремента для недействительного итератора. Попробуй "разыменовать" этот итератор, обращаясь к какому-нибудь члену, тогда и полетит.
1
IVSasha
6 / 6 / 3
Регистрация: 29.07.2015
Сообщений: 61
19.09.2015, 16:25  [ТС] 3
Цитата Сообщение от Enno Посмотреть сообщение
Попробуй "разыменовать" этот итератор, обращаясь к какому-нибудь члену, тогда и полетит.
После c.erase(it) обращаюсь к удаленному элементу
C++
1
std::cout << "[" << it->first << "; " << it->second << "] deleted." << std::endl;
Вот это выводит в консоль
[; 5] deleted.
Т.е. ошибок нет даже при разыменовании удаленного элемента

Добавлено через 1 час 10 минут
up...
0
Kerry_Jr
Эксперт PHP
2210 / 2006 / 940
Регистрация: 14.05.2014
Сообщений: 5,869
Записей в блоге: 1
Завершенные тесты: 5
19.09.2015, 16:30 4
IVSasha, разыменование невалидного итератора есть UB
1
IVSasha
6 / 6 / 3
Регистрация: 29.07.2015
Сообщений: 61
19.09.2015, 16:33  [ТС] 5
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
разыменование невалидного итератора есть UB
теперь все ясно. спасибо
0
hoggy
Нарушитель
Эксперт С++
7088 / 3131 / 648
Регистрация: 15.11.2014
Сообщений: 7,211
Завершенные тесты: 1
19.09.2015, 16:43 6
Лучший ответ Сообщение было отмечено IVSasha как решение

Решение

Цитата Сообщение от IVSasha Посмотреть сообщение
Любые попытки использования it
после удаления элемента без повторной инициализации - даже команда ++it
- приводят к непредсказуемым последствиям.
под "непредсказумемыми" следует понимать UB (неопределенное поведение).
то есть может быть все, что угодно:

1.
программа может каким то чудом работать.

2.
а потом падать в зависимости от фазы луны.

3.
сразу же протянуть лапки к верху

4.
послать вам открытку на почту

5.
и тд.

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

все остальные итераторы остаются валидными,
а это значит - дерево не перестраивалось.
все объекты в контейнере сохраняют свои адреса.

поэтому, несмотря на то,
что после удаления итератор смотрит на мертвый объект,
его связь с следом идущим элементом
какое то время ещё может сохранять актуальность.
стандарт вам этого не гарантирует.

поэтому, считайте, что вам просто не повезло:
программа в условиях UB иногда сохраняет работоспособность.
1
19.09.2015, 16:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2015, 16:43

Явных ошибок нет, но программа не работает
Задание было такое: 1. Разработать программу, которая создает массив, количество элементов...

Не работает программа, ошибок компиляции нет.
Есть вот такая программа: поменять местами строки в матрице с мин и макс значениями. Писал в вижуал...

Почему столько много синтакситечких ошибок?
Здравствуйте, пожалуйста, скажите почему компилятор так ругается на код? И вообще он будет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru