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

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

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

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

30.07.2012, 00:49. Просмотров 1066. Ответов 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++
выводит ошибку, как исправить 1&gt;22.cpp(41): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не...

Контейнерные классы - C++
Собственно что это?:) Если можно, скиньте ссылку, где есть примеры на visual C++ на русском. Спасибо

Контейнерные классы - C++
Помогите пожалуйста, очень срочно!!!!Необходимо исправить программу! Работает не коректно.. Условия: Написать программу...

Контейнерные классы C++. - C++
Здраствуйте:)Поскажите пожалуйста по нижеприведенному коду, сама не могу разобраться, хотя смотрела в учебниках и по инету не могу найти...

Контейнерные классы - C++
Добрый вечер! Получил задание на редактирование параграфов из файла. Решил делать через контейнер вида map. Все считывается и выводится,...

Последовательные контейнерные классы - C++
Составить программу, используя последовательные классы стандартной библиотеки шаблонов С++, которая содержит текущую информацию о заявках...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
2447 / 1652 / 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
бжни
2447 / 1652 / 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
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
30.07.2012, 01:55     Контейнерные классы #6
вам так только кажется. контейнеры для того и сделаны, чтобы не парится о том, как они там хранят и удаляют объекты.
Avazart
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,449
Записей в блоге: 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
Сообщений: 392
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
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,449
Записей в блоге: 17
30.07.2012, 19:24     Контейнерные классы #9
В принципе да...

Но опять таки это не очень удобно и прозрачно, поэтому стоит смотреть в сторону умных указателей ( к примеру из boost-a)
edward_jonson
158 / 158 / 25
Регистрация: 23.02.2011
Сообщений: 392
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
Эксперт С++
7122 / 5299 / 273
Регистрация: 10.12.2010
Сообщений: 23,449
Записей в блоге: 17
30.07.2012, 19:39     Контейнерные классы #11
Ну так "6" это тоже мусор, т.е. считается мусором после delete.
delete по сути не чистит память, а лишь обьявляет её недействительной.
DU
1482 / 1058 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
30.07.2012, 19:40     Контейнерные классы #12
а что вы ожидали? почему шестерка за мусор не считается?
при удалении не обязательно в память что-то записывать, обозначив тем самым что она свободна, зачем эти лишние движения. когда в ней что-то создастся по новому, тогда и перезапишется она.
novi4ok
551 / 504 / 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++
Есть три типа контейнеров – вектор (vector) и список (list). (Третий последовательный контейнер – двусторонняя очередь (deque а третий он...

КЛАССЫ - C++
Очень нужна помощь!!! подскажите где ошибки: #include &lt;iostream&gt; #include &lt;windows.h&gt; char* Rus(const char* text); using...


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

Или воспользуйтесь поиском по форуму:
edward_jonson
158 / 158 / 25
Регистрация: 23.02.2011
Сообщений: 392
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