Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
dzrkot
zzzZZZ...
522 / 352 / 53
Регистрация: 11.09.2013
Сообщений: 2,022
#1

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

30.04.2014, 09:42. Просмотров 495. Ответов 14
Метки нет (Все метки)

вообщем падает задача через раз, вроде бы в 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2014, 09:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Утечка памяти или что? Валидность итератора (C++):

Валидность итератора - C++
Допустимо ли делать такие проверки? Код то отрабатывает, но можно ли так делать? std::vector&lt;int&gt; vec = {1, 2, 3, 4, 5}; auto it =...

удаляется ли объект или происходит утечка памяти? - C++
Добрый день, подскажите, при таком коде, удаляется ли объект или происходит утечка памяти? std::list&lt;A*&gt; entities; ...

"Утечка " памяти. Да или нет? - C++
Есть фоксовское приложение. Оно в отдельном потоке запускает комсервер, написанный тоже на фоксе, который запускает одну из двух функций...

утечка памяти - C++
Может кто-то проверить есть ли здесь утечка памяти? Мне почему-то кажется что есть. В задачи нужно когда пользователь сделал операции...

Утечка памяти - C++
Здравствуйте. Есть программа (разбитая на функции) постоянно работающая в цикле и выводящая информацию на консоль. И получается что она...

Утечка памяти - C++
Не могу понять как избежать утечки памяти в своей программе... привожу кусок в одном из мест где на мой взгляд она происходит... Array...

14
0x10
2478 / 1651 / 247
Регистрация: 24.11.2012
Сообщений: 4,087
30.04.2014, 10:17 #2
Строки 25-27: вектор не гарантирует стабильность итераторов, поэтому Вы пилите сук, на котором сидите. См в сторону std::remove_if.
1
SatanaXIII
Супер-модератор
Эксперт С++
5618 / 2653 / 246
Регистрация: 01.11.2011
Сообщений: 6,549
Завершенные тесты: 1
30.04.2014, 10:19 #3
Цитата Сообщение от 0x10 Посмотреть сообщение
вектор не гарантирует стабильность итераторов
Не могли бы вы уточняюще перефразировать?
1
dzrkot
zzzZZZ...
522 / 352 / 53
Регистрация: 11.09.2013
Сообщений: 2,022
30.04.2014, 10:27  [ТС] #4
Цитата Сообщение от 0x10 Посмотреть сообщение
Строки 25-27
так там string ...
0
Kuzia domovenok
1948 / 1801 / 138
Регистрация: 25.03.2012
Сообщений: 6,240
Записей в блоге: 1
30.04.2014, 10:38 #5
Цитата Сообщение от dzrkot Посмотреть сообщение
так там string ...
не важно. После таких действий как push_back, erase и.т.д. итераторы вектора могут перестать быть валидными.
1
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.04.2014, 10:39 #6
Цитата Сообщение от dzrkot Посмотреть сообщение
так там string ...
и что? вызов любой не константной функции может сделать итератор недействительным
1
dzrkot
zzzZZZ...
522 / 352 / 53
Регистрация: 11.09.2013
Сообщений: 2,022
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;
0
0x10
2478 / 1651 / 247
Регистрация: 24.11.2012
Сообщений: 4,087
30.04.2014, 11:08 #8
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Не могли бы вы уточняюще перефразировать?
В принципе выше уже ответили, но на всякий случай. Erase уадляет элемент. В случае последовательного контейнера это приводит к смещению всех следующих за ним элементов к началу. Как следствие, если у нас были итераторы, хранящие позицию конкретных элементов, то при таком сдвиге все позиции становятся невалидными, и могут даже указывать за пределы контейнера.

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

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

Не по теме:

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

0
dzrkot
zzzZZZ...
522 / 352 / 53
Регистрация: 11.09.2013
Сообщений: 2,022
30.04.2014, 11:14  [ТС] #10
Цитата Сообщение от 0x10 Посмотреть сообщение
В принципе выше уже ответили, но на всякий случай. Erase уадляет элемент. В случае последовательного контейнера это приводит к смещению всех следующих за ним элементов к началу. Как следствие, если у нас были итераторы, хранящие позицию конкретных элементов, то при таком сдвиге все позиции становятся невалидными, и могут даже указывать за пределы контейнера.
Другая ситуация с std::list. В нем удаление элемента по сути означает перебрасывание пары указателей, т.е. незатронутые удалением элементы не меняют своего положения и итераторы, указывающие на них, можно использовать.
спасибо, буду знать)
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 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;    
}
Да и вообще в коде много маленьких ляпов вроде использования постфиксных инкрементов, отсутствие резервирования памяти.
1
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
30.04.2014, 12:51 #12
Цитата Сообщение от 0x10 Посмотреть сообщение
при таком сдвиге все позиции становятся невалидными
Как минимум те, которые указывали на элементы после удаленного. На элементы расположенные ДО это скорее всего не скажется.
0
Kuzia domovenok
1948 / 1801 / 138
Регистрация: 25.03.2012
Сообщений: 6,240
Записей в блоге: 1
30.04.2014, 12:55 #13
Цитата Сообщение от Tulosba Посмотреть сообщение
Как минимум те, которые указывали на элементы после удаленного. На элементы расположенные ДО это скорее всего не скажется.
это почему ещё?
при вставке элемента вектор расширяется, и, если его новый размер больше зарезервированной под внутренний буфер памяти, начнётся операция перемещения данных в векторе из старого буфера в новый. При этом все итераторы станут невалидными, т.к. они скарее всего реализованы как указатели на элементы старого внутреннего буфера.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
30.04.2014, 13:46 #14
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
это почему ещё?
потому что речь шла об удалении в том сообщении, а не о вставке.
0
0x10
30.04.2014, 14:22     Утечка памяти или что? Валидность итератора
  #15

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2014, 14:22
Привет! Вот еще темы с ответами:

Утечка памяти - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;ArrayOperation.h&quot; using namespace std; int main() { int...

Утечка памяти - C++
Либо я себе мозг запудрила, либо помогите мне :) есть у меня вектор vector&lt;char*&gt; names_variable; дополняю его таким образом ...

Утечка памяти - C++
Взял листинг кода из книги Стивен Прата Язык программирования С++. Меня терзают смутные сомнения нет ли здесь утечки памяти, указатель ...

Утечка памяти - C++
Где я допустил ее(утечку)? #define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;string&gt; class...


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

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

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