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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
#1

Контейнерные классы - C++

30.07.2012, 00:49. Просмотров 1060. Ответов 13
Метки нет (Все метки)

Есть некоторое сомнения, помоготи пожалуйста:

Если у меня есть например такой код:

C++
1
2
3
4
vector<int> * pmyvec;
pmyvec->push_back(3);
pmyvec->push_back(4);
delete pmyvec;
Есть ли в этом коде утечка памяти?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2012, 00:49     Контейнерные классы
Посмотрите здесь:

C++ Контейнерные классы
Классы C++
Классы C++
Контейнерные классы C++
классы C++
Контейнерные классы C++. C++
C++ Последовательные контейнерные классы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
30.07.2012, 00:56     Контейнерные классы #2
Цитата Сообщение от ramybozy Посмотреть сообщение
Есть ли в этом коде утечка памяти?
в вашей программе есть как минимум три краха - со второй по четвертую строку
где вы сам контейнер то создаете?
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
30.07.2012, 00:59  [ТС]     Контейнерные классы #3
Хорошо, вот так меняем:

C++
1
2
3
4
vector<int> * pmyvec = new vector<int>;
pmyvec->push_back(3);
pmyvec->push_back(4);
delete pmyvec;
Вопрос тот же.
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
30.07.2012, 01:15     Контейнерные классы #4
так - нет
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
30.07.2012, 01:33  [ТС]     Контейнерные классы #5
А что делается с теми элементами, которые засунуты в вектор.
Интуитивно кажется, что они не освобождаются.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
30.07.2012, 01:55     Контейнерные классы #6
вам так только кажется. контейнеры для того и сделаны, чтобы не парится о том, как они там хранят и удаляют объекты.
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
30.07.2012, 16:00     Контейнерные классы #7
Нужно парится при таком коде:

C++
1
2
3
4
vector<int*>  myvec;
myvec.push_back(new int(5) );
myvec.push_back(new int(6) );
myvec.clear();  /* Упс !!! */
edward_jonson
158 / 158 / 25
Регистрация: 23.02.2011
Сообщений: 390
30.07.2012, 19:21     Контейнерные классы #8
Avazart, И какой в этом случае выход?
C++
1
2
    for(std::vector<int*>::iterator it = myvec.begin(); it != myvec.end(); it ++)
        delete *it;
?
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
30.07.2012, 19:24     Контейнерные классы #9
В принципе да...

Но опять таки это не очень удобно и прозрачно, поэтому стоит смотреть в сторону умных указателей ( к примеру из boost-a)
edward_jonson
158 / 158 / 25
Регистрация: 23.02.2011
Сообщений: 390
30.07.2012, 19:34     Контейнерные классы #10
Сейчас проверил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int*>  myvec;
 
    myvec.push_back( new int(5) );
    myvec.push_back( new int(6) );
 
    for(std::vector<int*>::iterator it = myvec.begin(); it != myvec.end(); it ++)
        std::cout << **it << " ";
 
    for(std::vector<int*>::iterator it = myvec.begin(); it != myvec.end(); it ++)
        delete *it;
 
    std::cout << std::endl;
 
    for(std::vector<int*>::iterator it = myvec.begin(); it != myvec.end(); it ++)
        std::cout << **it << " ";
 
    return 0;
}
Почему-то не очищается область памяти второго указателя, т.е. выводится
Код
5 6
мусор 6
Avazart
7065 / 5242 / 262
Регистрация: 10.12.2010
Сообщений: 23,062
Записей в блоге: 17
30.07.2012, 19:39     Контейнерные классы #11
Ну так "6" это тоже мусор, т.е. считается мусором после delete.
delete по сути не чистит память, а лишь обьявляет её недействительной.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
30.07.2012, 19:40     Контейнерные классы #12
а что вы ожидали? почему шестерка за мусор не считается?
при удалении не обязательно в память что-то записывать, обозначив тем самым что она свободна, зачем эти лишние движения. когда в ней что-то создастся по новому, тогда и перезапишется она.
novi4ok
550 / 503 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
30.07.2012, 19:59     Контейнерные классы #13
по-хорошему нужно было бы дополнить этот код:

Цитата Сообщение от edward_jonson Посмотреть сообщение
C++
1
2
3
4
for(std::vector<int*>::iterator it = myvec.begin(); it != myvec.end(); it ++){
        delete *it;
        *it = NULL
    }
и взять за правило: если при объявлении указателю не нужно присваивать значение, нужно присвоить ему NULL, то же самое делать сразу после delete, если указателю следующим оператором не присваивается новое значение. меньше сюрпризов будет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2012, 01:02     Контейнерные классы
Еще ссылки по теме:

C++ Абстрактные контейнерные типы ?
Контейнерные классы: стек и очередь C++
C++ контейнерные классы
C++ классы с++
Контейнерные классы C++

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

Или воспользуйтесь поиском по форуму:
edward_jonson
158 / 158 / 25
Регистрация: 23.02.2011
Сообщений: 390
31.07.2012, 01:02     Контейнерные классы #14
Окей )
Yandex
Объявления
31.07.2012, 01:02     Контейнерные классы
Ответ Создать тему
Опции темы

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