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

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

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

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

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

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

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

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

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

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

контейнерные классы - C++
выводит ошибку, как исправить 1&gt;22.cpp(41): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не...

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

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

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

13
alex_x_x
бжни
2454 / 1659 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
30.07.2012, 00:56 #2
Цитата Сообщение от ramybozy Посмотреть сообщение
Есть ли в этом коде утечка памяти?
в вашей программе есть как минимум три краха - со второй по четвертую строку
где вы сам контейнер то создаете?
0
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;
Вопрос тот же.
0
alex_x_x
бжни
2454 / 1659 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
30.07.2012, 01:15 #4
так - нет
1
ramybozy
8 / 8 / 0
Регистрация: 01.07.2012
Сообщений: 138
30.07.2012, 01:33  [ТС] #5
А что делается с теми элементами, которые засунуты в вектор.
Интуитивно кажется, что они не освобождаются.
0
DU
1485 / 1131 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
30.07.2012, 01:55 #6
вам так только кажется. контейнеры для того и сделаны, чтобы не парится о том, как они там хранят и удаляют объекты.
1
Avazart
Эксперт С++
7574 / 5559 / 327
Регистрация: 10.12.2010
Сообщений: 24,934
Записей в блоге: 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();  /* Упс !!! */
1
edward_jonson
160 / 160 / 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;
?
0
Avazart
Эксперт С++
7574 / 5559 / 327
Регистрация: 10.12.2010
Сообщений: 24,934
Записей в блоге: 17
30.07.2012, 19:24 #9
В принципе да...

Но опять таки это не очень удобно и прозрачно, поэтому стоит смотреть в сторону умных указателей ( к примеру из boost-a)
0
edward_jonson
160 / 160 / 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
0
Avazart
Эксперт С++
7574 / 5559 / 327
Регистрация: 10.12.2010
Сообщений: 24,934
Записей в блоге: 17
30.07.2012, 19:39 #11
Ну так "6" это тоже мусор, т.е. считается мусором после delete.
delete по сути не чистит память, а лишь обьявляет её недействительной.
1
DU
1485 / 1131 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
30.07.2012, 19:40 #12
а что вы ожидали? почему шестерка за мусор не считается?
при удалении не обязательно в память что-то записывать, обозначив тем самым что она свободна, зачем эти лишние движения. когда в ней что-то создастся по новому, тогда и перезапишется она.
1
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, если указателю следующим оператором не присваивается новое значение. меньше сюрпризов будет.
1
edward_jonson
160 / 160 / 25
Регистрация: 23.02.2011
Сообщений: 392
31.07.2012, 01:02 #14
Окей )
0
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; class Point { public: void SetX(int...


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

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

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