Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
8 / 8 / 1
Регистрация: 01.07.2012
Сообщений: 138
1

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

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

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

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

C++
1
2
3
4
vector<int> * pmyvec;
pmyvec->push_back(3);
pmyvec->push_back(4);
delete pmyvec;
Есть ли в этом коде утечка памяти?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.07.2012, 00:49
Ответы с готовыми решениями:

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

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

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

Контейнерные классы
1. Опишите класс «Штучка», описывающий какую либо материальную вещь. Данные класса: Название,...

13
бжни
2467 / 1676 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
30.07.2012, 00:56 2
Цитата Сообщение от ramybozy Посмотреть сообщение
Есть ли в этом коде утечка памяти?
в вашей программе есть как минимум три краха - со второй по четвертую строку
где вы сам контейнер то создаете?
0
8 / 8 / 1
Регистрация: 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
бжни
2467 / 1676 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
30.07.2012, 01:15 4
так - нет
1
8 / 8 / 1
Регистрация: 01.07.2012
Сообщений: 138
30.07.2012, 01:33  [ТС] 5
А что делается с теми элементами, которые засунуты в вектор.
Интуитивно кажется, что они не освобождаются.
0
DU
1492 / 1138 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
30.07.2012, 01:55 6
вам так только кажется. контейнеры для того и сделаны, чтобы не парится о том, как они там хранят и удаляют объекты.
1
Эксперт С++
8292 / 6047 / 601
Регистрация: 10.12.2010
Сообщений: 28,133
Записей в блоге: 26
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
161 / 161 / 68
Регистрация: 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
Эксперт С++
8292 / 6047 / 601
Регистрация: 10.12.2010
Сообщений: 28,133
Записей в блоге: 26
30.07.2012, 19:24 9
В принципе да...

Но опять таки это не очень удобно и прозрачно, поэтому стоит смотреть в сторону умных указателей ( к примеру из boost-a)
0
161 / 161 / 68
Регистрация: 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
Эксперт С++
8292 / 6047 / 601
Регистрация: 10.12.2010
Сообщений: 28,133
Записей в блоге: 26
30.07.2012, 19:39 11
Ну так "6" это тоже мусор, т.е. считается мусором после delete.
delete по сути не чистит память, а лишь обьявляет её недействительной.
1
DU
1492 / 1138 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
30.07.2012, 19:40 12
а что вы ожидали? почему шестерка за мусор не считается?
при удалении не обязательно в память что-то записывать, обозначив тем самым что она свободна, зачем эти лишние движения. когда в ней что-то создастся по новому, тогда и перезапишется она.
1
554 / 508 / 25
Регистрация: 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
161 / 161 / 68
Регистрация: 23.02.2011
Сообщений: 392
31.07.2012, 01:02 14
Окей )
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.07.2012, 01:02

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

Последовательные контейнерные классы
Составить программу, используя последовательные классы стандартной библиотеки шаблонов С++, которая...

Контейнерные классы: стек и очередь
Создать класс“Сотрудник”, состоящей из класса ”Зарплата”. Класс “Сотрудник ”: фамилия сотрудника,...

Библиотека потокового ввода-вывода и контейнерные классы.Дешифровка
Задание:Создать функцию, которая расшифровывает зашифрованный файл на основании файла- ключа....

Абстрактные контейнерные типы ?
Есть три типа контейнеров – вектор (vector) и список (list). (Третий последовательный контейнер –...


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

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

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