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

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

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

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

30.04.2014, 09:42. Просмотров 471. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2014, 09:42     Утечка памяти или что? Валидность итератора
Посмотрите здесь:

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

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

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

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

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

утечка памяти - C++
если запустить код char *pointer = NULL; for( int i = 0; i &lt; 10; i++ ) { pointer = new char; } delete pointer; , то есть...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
30.04.2014, 10:17     Утечка памяти или что? Валидность итератора #2
Строки 25-27: вектор не гарантирует стабильность итераторов, поэтому Вы пилите сук, на котором сидите. См в сторону std::remove_if.
SatanaXIII
Супер-модератор
Эксперт С++
5604 / 2638 / 242
Регистрация: 01.11.2011
Сообщений: 6,497
Завершенные тесты: 1
30.04.2014, 10:19     Утечка памяти или что? Валидность итератора #3
Цитата Сообщение от 0x10 Посмотреть сообщение
вектор не гарантирует стабильность итераторов
Не могли бы вы уточняюще перефразировать?
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
30.04.2014, 10:27  [ТС]     Утечка памяти или что? Валидность итератора #4
Цитата Сообщение от 0x10 Посмотреть сообщение
Строки 25-27
так там string ...
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
30.04.2014, 10:38     Утечка памяти или что? Валидность итератора #5
Цитата Сообщение от dzrkot Посмотреть сообщение
так там string ...
не важно. После таких действий как push_back, erase и.т.д. итераторы вектора могут перестать быть валидными.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.04.2014, 10:39     Утечка памяти или что? Валидность итератора #6
Цитата Сообщение от dzrkot Посмотреть сообщение
так там string ...
и что? вызов любой не константной функции может сделать итератор недействительным
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
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
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
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...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 1,996
30.04.2014, 11:14  [ТС]     Утечка памяти или что? Валидность итератора #10
Цитата Сообщение от 0x10 Посмотреть сообщение
В принципе выше уже ответили, но на всякий случай. Erase уадляет элемент. В случае последовательного контейнера это приводит к смещению всех следующих за ним элементов к началу. Как следствие, если у нас были итераторы, хранящие позицию конкретных элементов, то при таком сдвиге все позиции становятся невалидными, и могут даже указывать за пределы контейнера.
Другая ситуация с std::list. В нем удаление элемента по сути означает перебрасывание пары указателей, т.е. незатронутые удалением элементы не меняют своего положения и итераторы, указывающие на них, можно использовать.
спасибо, буду знать)
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 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
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
30.04.2014, 12:51     Утечка памяти или что? Валидность итератора #12
Цитата Сообщение от 0x10 Посмотреть сообщение
при таком сдвиге все позиции становятся невалидными
Как минимум те, которые указывали на элементы после удаленного. На элементы расположенные ДО это скорее всего не скажется.
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
30.04.2014, 12:55     Утечка памяти или что? Валидность итератора #13
Цитата Сообщение от Tulosba Посмотреть сообщение
Как минимум те, которые указывали на элементы после удаленного. На элементы расположенные ДО это скорее всего не скажется.
это почему ещё?
при вставке элемента вектор расширяется, и, если его новый размер больше зарезервированной под внутренний буфер памяти, начнётся операция перемещения данных в векторе из старого буфера в новый. При этом все итераторы станут невалидными, т.к. они скарее всего реализованы как указатели на элементы старого внутреннего буфера.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
30.04.2014, 13:46     Утечка памяти или что? Валидность итератора #14
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
это почему ещё?
потому что речь шла об удалении в том сообщении, а не о вставке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2014, 14:22     Утечка памяти или что? Валидность итератора
Еще ссылки по теме:

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

Утечка памяти?! - C++
Джесс Либерти и Дэвид Хорват &quot;Освой самостоятельно С++ за 24 часа&quot;, вырезка из листинга 15.4 (стр 233): Строка 26 - Утечка памяти?...

Утечка памяти - C++
Доброго времени суток! Столкнулся с проблемой утечки памяти! Будь у меня маленькая программка, выловил бы легко, но в 2000 строк кода все...

Утечка памяти - C++
Помогите с кодом, вот написал реализацию стека по заданию. Преподаватель попросил проверить, верно ли я использую delete, ибо mas в классе...


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

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

Не по теме:

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

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

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