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

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

Войти
Регистрация
Восстановить пароль
 
 
KEZz
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 22
#1

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

23.11.2012, 23:52. Просмотров 724. Ответов 19
Метки нет (Все метки)

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
чё за.. почему вызываются деструкторы у объектов масива?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2012, 23:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массив объектов, деструктор (C++):

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

Почему деструктор срабатывает больше раз, чем количество созданных объектов? - C++
Вопрос в заголовке темы. Почему? Создается всего 2 объекта, но деструктор вызывается трижды. Вот пример #include &lt;iostream&gt; #include...

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

Одномерный динамический массив(конструктор и деструктор) - C++
Может кто чем поможет по решению задачи?или подскажите где искать заранее спасибо. 1. произведение элементов массива, расположенных между...

Написать класс Матрица. Массив объектов класса Массив - C++
Написать класс Матрица (в данном случае матрица – массив объектов класса Массив из предыдущего задания). В классе реализовать следующие...

Массив объектов - C++
Доброго времени суток... Подскажите пожалуйста у меня есть следующий код: class vertex{ public: float x; float y; ...

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

Функция в качестве параметра принимает ссылку на константный объект. То есть объект должен существовать, что бы функция могла его скопировать в вектор. Если использовать запись вида class_name( arg ), то создается временный безымянный объект, после чего он копируется в вектор и, естественно, удаляется. То есть если бы Вы передавали существующий объект, то использовался бы только конструктор копии объекта.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2012, 00:28 #5
Цитата Сообщение от KEZz Посмотреть сообщение
мне освобождать память потом СВОИМ деструктором
Деструктор не освобождает память. Вектор сам позаботится об освобождении памяти.
1
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 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
0
alsav22
5428 / 4823 / 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
0
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
24.11.2012, 00:50 #8
alsav22, я лишь сказал, что точно будет. А то, о чем говорите Вы - это возможные особенности реализации.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.11.2012, 00:52 #9
Цитата Сообщение от Toshkarik Посмотреть сообщение
alsav22, я лишь сказал, что точно будет. А то, о чем говорите Вы - это возможные особенности реализации.
Согласен.
0
KEZz
1 / 1 / 0
Регистрация: 13.10.2012
Сообщений: 22
24.11.2012, 00:59  [ТС] #10
Jupiter, именно! я про вот эту утечку! Как быть с классами? обычное удаление объектов из массива неосвобождает память занятую инфой в самом объекте .erase() .clear() ?

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

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

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

Добавлено через 12 минут
Память под объекты классов выделяется и освобождается так же, как и под переменные встроенных типов. Если объекты создаются в локальной области, то память под ними будет освобождаться (автоматически) при выходе из этой области, если в глобальной, то при завершении программы, если в динамической, то программист сам должен позаботиться об освобождении памяти.
Здесь можете почитать: http://www.cyberforum.ru/blogs/18334/blog103.html
1
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);
и потом освободить? =)
0
alsav22
5428 / 4823 / 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));
0
24.11.2012, 01:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2012, 01:48
Привет! Вот еще темы с ответами:

Массив объектов - C++
Задумка: Сделать некую подобию базы данных, список из &quot;объектов&quot;. К объектам привязаны соответствующие данные разных типов (int, char и...

Массив объектов - C++
Можно так написать? class A {бла-бла-бла} void main() { int x=3; A *arr = new A; }

С++ массив объектов - C++
Люди начался новый учебный год опять обращаюсь за помощью File Имя файла.размер. количество обращений. создать массив объектов.ввывести. ...

Массив объектов - C++
Создать массив объектов разного типа невозможно. Но, наверное, можно создать массив объектов, поле которых, будет содержать указатель на...


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

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

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