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

Массив объектов, деструктор - C++

Восстановить пароль Регистрация
 
KEZz
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 22
23.11.2012, 23:52     Массив объектов, деструктор #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class cA
{
    int r;
public:
    cA(int t){r=t; cout << "cA konstruktor " << r << endl;};
    ~cA(void){cout << "cA destructor " << r << endl;};
    int setAt(void){return r;};
};
int _tmain(int argc, _TCHAR* argv[])
{
    cA ob1 = cA(7);
 
    std::vector<cA> cAmap;
    cAmap.push_back(cA(1));
    cAmap.push_back(cA(4));
    cout << cAmap[0].setAt() << endl << cAmap[1].setAt();
 
    _getch();
}
Вывод:
cA konstruktor 7
cA konstruktor 1
cA destructor 1
cA konstruktor 4
cA destructor 1
cA destructor 4
1
4
чё за.. почему вызываются деструкторы у объектов масива?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2012, 23:52     Массив объектов, деструктор
Посмотрите здесь:

Массив объектов C++
Массив объектов C++
Одномерный динамический массив(конструктор и деструктор) C++
C++ Массив объектов
C++ массив объектов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
24.11.2012, 00:17     Массив объектов, деструктор #2
KEZz, потому что при вызове функции push_back создается временный объект.
KEZz
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 22
24.11.2012, 00:22  [ТС]     Массив объектов, деструктор #3
спс за ответ, но а это плохо?)) что я так векторами пользуюсь... если я буду например в таких классах хранить например текстуры, мне освобождать память потом СВОИМ деструктором (функцией-членом) надо будет?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
24.11.2012, 00:28     Массив объектов, деструктор #4
KEZz, Немного не понял вопроса. Но отвечу на предыдущий чуть полнее.

Функция в качестве параметра принимает ссылку на константный объект. То есть объект должен существовать, что бы функция могла его скопировать в вектор. Если использовать запись вида class_name( arg ), то создается временный безымянный объект, после чего он копируется в вектор и, естественно, удаляется. То есть если бы Вы передавали существующий объект, то использовался бы только конструктор копии объекта.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2012, 00:28     Массив объектов, деструктор #5
Цитата Сообщение от KEZz Посмотреть сообщение
мне освобождать память потом СВОИМ деструктором
Деструктор не освобождает память. Вектор сам позаботится об освобождении памяти.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.11.2012, 00:36     Массив объектов, деструктор #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Вектор сам позаботится об освобождении памяти.
alsav22, каждый убирает только за собой
C++
1
2
3
4
{
    std::vector<int*> vec;
    vec.push_back(new int());
} //memory leak
C++
1
2
3
4
5
6
7
8
9
struct leak {
    int* ptr;
    leak() : ptr(new int()) { }
};
//...
{
    std::vector<leak> vec;
    vec.push_back(leak());
} //memory leak
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2012, 00:49     Массив объектов, деструктор #7
Цитата Сообщение от Toshkarik Посмотреть сообщение
Но отвечу на предыдущий чуть полнее.
Тут может ещё специфика рабты push_back(). При добавлении нового объекта в вектор срабатывают десрукторы для всех объектов, находящихся в векторе, в том числе и для добавляемого.

Добавлено через 11 минут
Например, такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
cA ob1(1);
cA ob2(2);
cA ob3(3);
cA ob4(4);
 
    std::vector<cA> cAmap;
    
    cAmap.push_back(ob1);
    cAmap.push_back(ob2);
    cAmap.push_back(ob3);
    cAmap.push_back(ob4);
выдаст:
cA konstruktor 1
cA konstruktor 2
cA konstruktor 3
cA konstruktor 4
cA destructor 1
cA destructor 1
cA destructor 2
cA destructor 1
cA destructor 2
cA destructor 3
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
24.11.2012, 00:50     Массив объектов, деструктор #8
alsav22, я лишь сказал, что точно будет. А то, о чем говорите Вы - это возможные особенности реализации.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2012, 00:52     Массив объектов, деструктор #9
Цитата Сообщение от Toshkarik Посмотреть сообщение
alsav22, я лишь сказал, что точно будет. А то, о чем говорите Вы - это возможные особенности реализации.
Согласен.
KEZz
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 22
24.11.2012, 00:59  [ТС]     Массив объектов, деструктор #10
Jupiter, именно! я про вот эту утечку! Как быть с классами? обычное удаление объектов из массива неосвобождает память занятую инфой в самом объекте .erase() .clear() ?

З.Ы. Сори я самоучка...
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2012, 01:08     Массив объектов, деструктор #11
Цитата Сообщение от Jupiter Посмотреть сообщение
alsav22, каждый убирает только за собой
Тоже согласен.

Добавлено через 7 минут
Цитата Сообщение от KEZz Посмотреть сообщение
обычное удаление объектов из массива неосвобождает память занятую инфой в самом объекте
Цитата Сообщение от Jupiter Посмотреть сообщение
каждый убирает только за собой
Если в объекте вы выделяли память, то вам её и освобождать.
KEZz
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 22
24.11.2012, 01:20  [ТС]     Массив объектов, деструктор #12
я наверное щас дурачком покажусь... но я незнаю как
Я думал вызов Obj.~ClassA(); это и есть правельное освобождение

Допустим в моём примере int r как освободить грамотно? Дописать в класс
C++
1
cA::Dest(){delete[чёто-там] ;};
??
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2012, 01:34     Массив объектов, деструктор #13
В вашем примере ничего освобождать не надо. Речь идёт о динамически выделяемой памяти (через new).

Добавлено через 12 минут
Память под объекты классов выделяется и освобождается так же, как и под переменные встроенных типов. Если объекты создаются в локальной области, то память под ними будет освобождаться (автоматически) при выходе из этой области, если в глобальной, то при завершении программы, если в динамической, то программист сам должен позаботиться об освобождении памяти.
Здесь можете почитать: http://www.cyberforum.ru/blogs/18334/blog103.html
KEZz
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 22
24.11.2012, 01:38  [ТС]     Массив объектов, деструктор #14
Спасибо за ответы!
За одно ещё один вопрос:

C++
1
2
3
4
ClassA Obj(34);
 //равносилен  
std::vector<ClassA> mapObj;
mapObj.push_back(Obj(34));
А как ПРАВИЛЬНО в массив векторов такое запихнуть:
C++
1
2
ClassA* Obj = 0;
Obj = new ClassA(34);
и потом освободить? =)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2012, 01:48     Массив объектов, деструктор #15
Насчёт того, что чему равносильно, не понял, но это неверный код:
C++
1
2
3
4
ClassA Obj(34);
 //равносилен  
std::vector<ClassA> mapObj;
mapObj.push_back(Obj(34));
Нужно или так:
C++
1
2
3
ClassA Obj(34);
std::vector<ClassA> mapObj;
mapObj.push_back(Obj);
Или так:
C++
1
2
3
ClassA Obj(34);
std::vector<ClassA> mapObj;
mapObj.push_back(ClassA(34));
KEZz
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 22
24.11.2012, 01:51  [ТС]     Массив объектов, деструктор #16
дык как неправельный... вот почти тоже самое из моего 1ого поста:
C++
1
2
3
4
5
    cA ob1 = cA(7);
 
    std::vector<cA> cAmap;
    cAmap.push_back(cA(1));
    cAmap.push_back(cA(4));

-------
а, всё) понял) вот я имел ввиду как правильно создать массив из Динамических объектов

.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2012, 01:53     Массив объектов, деструктор #17
Цитата Сообщение от KEZz Посмотреть сообщение
А как ПРАВИЛЬНО в массив векторов такое запихнуть:
C++
1
2
3
4
ClassA* Obj = 0;
Obj = new ClassA(34);
std::vector<ClassA*> mapObj;
mapObj.push_back(Obj);
Добавлено через 1 минуту
Цитата Сообщение от KEZz Посмотреть сообщение
почти тоже самое
Совсем не то же самое. Obj(34) - это компилятору как понимать?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
24.11.2012, 01:59     Массив объектов, деструктор #18
KEZz,
C++
1
2
3
4
5
std::vector< cA * > objects;
objects.push_back( new cA( 10 ));
//... доходим до места, где уже не нужны объекты и нужно их удалить
for ( int i = 0; i < objects.size(); i++ )
   delete objects[ i ];
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2012, 02:02     Массив объектов, деструктор #19
Цитата Сообщение от KEZz Посмотреть сообщение
и потом освободить? =)
C++
1
delete Obj;
Или:
C++
1
delete mapObj[0];
Или:
C++
1
delete *(mapObj.begin());
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2012, 02:08     Массив объектов, деструктор
Еще ссылки по теме:

C++ массив объектов
C++ Почему создается виртуальный деструктор A, а в таблице виртуальных функций лежит деструктор B
C++ Виртуальный деструктор и уничтожение объектов

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

Или воспользуйтесь поиском по форуму:
KEZz
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 22
24.11.2012, 02:08  [ТС]     Массив объектов, деструктор #20
Toshkarik меня прам сразу понял! Спасибо!

И при
C++
1
objects.push_back( new cA( 10 ));
деструктор у меня не вызывался (прям слёзки счастья, то что надо!)

а я то ещё целую неделю Рефлекшн в С++ пытался внедрить...
Yandex
Объявления
24.11.2012, 02:08     Массив объектов, деструктор
Ответ Создать тему
Опции темы

Текущее время: 16:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru