Форум программистов, компьютерный форум CyberForum.ru

Утечка памяти или что? Валидность итератора - C++

Восстановить пароль Регистрация
 
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
30.04.2014, 09:42     Утечка памяти или что? Валидность итератора #1
вообщем падает задача через раз, вроде бы в 44 строке, вместо str+= надо бы по идее метод push_back() но при подстановке str.push_back(*it_v) ругается.... мб причина и не в этом
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
srand(time(0));
string str;
int size;
setlocale(LC_ALL,"Russian");
cout<<"Введите длинну последовательности : ";
cin>>size;
for (int i=0;i<size;i++)
  {
  str.push_back(char(65+rand()%60));
  if(rand()%7 == 0)
    str.push_back(' ');
  }
cout<<str<<endl;;
vector<string> a;
string::iterator it;
vector<string>::iterator it_v;
for (it=str.begin();it!=str.end();it++)
  if (*it>='h')
    str.erase(it);
cout<<str<<endl;
 
string temp;
for (it=str.begin();it!=str.end();it++)
  if (*it!=' ')
    temp.push_back(*it);
  else
    {
    a.push_back(temp);
    temp.clear();
    }
str.clear();
sort(a.begin(),a.end());
 
for (it_v=a.begin();it_v!=a.end();it_v++)
  {
  str+=*it_v+' ';
  }
cout<<endl<<str<<endl;
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2014, 09:42     Утечка памяти или что? Валидность итератора
Посмотрите здесь:

Утечка памяти C++
C++ Утечка памяти
"Утечка " памяти. Да или нет? C++
Утечка памяти C++
Утечка памяти C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
30.04.2014, 10:17     Утечка памяти или что? Валидность итератора #2
Строки 25-27: вектор не гарантирует стабильность итераторов, поэтому Вы пилите сук, на котором сидите. См в сторону std::remove_if.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,333
Завершенные тесты: 1
30.04.2014, 10:19     Утечка памяти или что? Валидность итератора #3
Цитата Сообщение от 0x10 Посмотреть сообщение
вектор не гарантирует стабильность итераторов
Не могли бы вы уточняюще перефразировать?
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
30.04.2014, 10:27  [ТС]     Утечка памяти или что? Валидность итератора #4
Цитата Сообщение от 0x10 Посмотреть сообщение
Строки 25-27
так там string ...
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
30.04.2014, 10:38     Утечка памяти или что? Валидность итератора #5
Цитата Сообщение от dzrkot Посмотреть сообщение
так там string ...
не важно. После таких действий как push_back, erase и.т.д. итераторы вектора могут перестать быть валидными.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.04.2014, 10:39     Утечка памяти или что? Валидность итератора #6
Цитата Сообщение от dzrkot Посмотреть сообщение
так там string ...
и что? вызов любой не константной функции может сделать итератор недействительным
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
30.04.2014, 11:00  [ТС]     Утечка памяти или что? Валидность итератора #7
вышел из положения)
C++
1
2
3
4
for (int i=0;i<str.length();i++)
  if (str[i]>='h')
    str.erase(str.begin()+i);
cout<<str<<endl;
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
30.04.2014, 11:08     Утечка памяти или что? Валидность итератора #8
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Не могли бы вы уточняюще перефразировать?
В принципе выше уже ответили, но на всякий случай. Erase уадляет элемент. В случае последовательного контейнера это приводит к смещению всех следующих за ним элементов к началу. Как следствие, если у нас были итераторы, хранящие позицию конкретных элементов, то при таком сдвиге все позиции становятся невалидными, и могут даже указывать за пределы контейнера.

Другая ситуация с std::list. В нем удаление элемента по сути означает перебрасывание пары указателей, т.е. незатронутые удалением элементы не меняют своего положения и итераторы, указывающие на них, можно использовать.

Цитата Сообщение от dzrkot Посмотреть сообщение
вышел из положения)
Закостылял.
Есть же нормальные решения - http://en.cppreference.com/w/cpp/algorithm/remove в связке с erase.
SatanaXIII
30.04.2014, 11:10
  #9

Не по теме:

Цитата Сообщение от 0x10 Посмотреть сообщение
В принципе выше уже ответили
Ага. Я прям сразу не понял про что речь. Но все равно спасибо.

dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
30.04.2014, 11:14  [ТС]     Утечка памяти или что? Валидность итератора #10
Цитата Сообщение от 0x10 Посмотреть сообщение
В принципе выше уже ответили, но на всякий случай. Erase уадляет элемент. В случае последовательного контейнера это приводит к смещению всех следующих за ним элементов к началу. Как следствие, если у нас были итераторы, хранящие позицию конкретных элементов, то при таком сдвиге все позиции становятся невалидными, и могут даже указывать за пределы контейнера.
Другая ситуация с std::list. В нем удаление элемента по сути означает перебрасывание пары указателей, т.е. незатронутые удалением элементы не меняют своего положения и итераторы, указывающие на них, можно использовать.
спасибо, буду знать)
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
30.04.2014, 11:23     Утечка памяти или что? Валидность итератора #11
К слову если внимательно изучить сигнатуру ф-и erase, то можно обратить внимание, что она возвращает итератор на следующий за удаленным элементом элемент. И тогда код можно записать например вот так:
C++
1
2
3
4
5
6
while(it != str.end()) {
    if (*it >= 'h')
        it = str.erase(it);
    else 
        ++it;    
}
Да и вообще в коде много маленьких ляпов вроде использования постфиксных инкрементов, отсутствие резервирования памяти.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.04.2014, 12:51     Утечка памяти или что? Валидность итератора #12
Цитата Сообщение от 0x10 Посмотреть сообщение
при таком сдвиге все позиции становятся невалидными
Как минимум те, которые указывали на элементы после удаленного. На элементы расположенные ДО это скорее всего не скажется.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
30.04.2014, 12:55     Утечка памяти или что? Валидность итератора #13
Цитата Сообщение от Tulosba Посмотреть сообщение
Как минимум те, которые указывали на элементы после удаленного. На элементы расположенные ДО это скорее всего не скажется.
это почему ещё?
при вставке элемента вектор расширяется, и, если его новый размер больше зарезервированной под внутренний буфер памяти, начнётся операция перемещения данных в векторе из старого буфера в новый. При этом все итераторы станут невалидными, т.к. они скарее всего реализованы как указатели на элементы старого внутреннего буфера.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.04.2014, 13:46     Утечка памяти или что? Валидность итератора #14
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
это почему ещё?
потому что речь шла об удалении в том сообщении, а не о вставке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2014, 14:22     Утечка памяти или что? Валидность итератора
Еще ссылки по теме:

утечка памяти C++
Утечка памяти C++
C++ Валидность итератора

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

Или воспользуйтесь поиском по форуму:
0x10
30.04.2014, 14:22     Утечка памяти или что? Валидность итератора
  #15

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
На элементы расположенные ДО это скорее всего не скажется
Да, я уж прост не расписывал с такой степенью детализации. Боюсь как бы потом не возникло нового вопроса типа "что стало с моими итераторами после shrink_to_fit, я ведь ничего не удалял".

Yandex
Объявления
30.04.2014, 14:22     Утечка памяти или что? Валидность итератора
Ответ Создать тему
Опции темы

Текущее время: 17:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru