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

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

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

Вызов деструктора для класса в векторе - C++

19.11.2014, 12:29. Просмотров 689. Ответов 4
Метки нет (Все метки)

Уважаемые знатоки, подскажите по-поводу деструктора класса, а то я совсем запутался вот в такой ситуации:
- есть класс - Ship;
- от него унаследовано два класса - BigShip, SmallShip;
- затем я создаю глобальный вектор указателей на базовый класс - vector<Ship*> Ships(10);
- по указателям выделяю память Ships[0] = new BigShip; Ships[1] = new SmallShip;... Ships[9] = new BigShip;

И вот нужно ли в конце программы вызывать вручную деструктор? И если да, то только для базового класса или и для унаследоваемых классов? Я сделал так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <vector>
#include "ship.h"
using namespace std;
 
vector<Ship*> Ships(10);
 
void main()
{
    Ships[0] = new BigShip; 
    Ships[1] = new SmallShip;
    ...
    Ships[9] = new BigShip;
 
//окончание программы
 
     for(int i = 0;i<Ships.size();i++)  //вызов деструктора
           Ships[i]->~Ship();
 
     cin.get();
}
А как правильно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2014, 12:29     Вызов деструктора для класса в векторе
Посмотрите здесь:

Вызов деструктора для копии - C++
вопрос в комментариях #include &lt;iostream&gt; #include &lt;iterator&gt; #include &lt;algorithm&gt; #include &lt;vector&gt; #include &lt;ctime&gt; #include...

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

Вызов деструктора - C++
Есть написанный мною код: #include &lt;iostream&gt; class Foo { private: int *key; public: Foo (const int a=0) { key = new int...

Вызов деструктора - C++
Вызывается ли деструктор объекта при завершении программы? а при аварийном завершении? А если снять процесс приложения диспетчером?

Вызов деструктора - C++
Доброго вам времени суток. Проблема в том, что деструктор не выводит сообщение без этой строки. s1.~Shave(); И я не уверен, что так...

Вызов деструктора - C++
При ручном вызове деструктора, освобождается ли память*

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Max Dark
шКодер самоучка
1813 / 1614 / 588
Регистрация: 09.10.2013
Сообщений: 3,618
Записей в блоге: 6
Завершенные тесты: 2
19.11.2014, 12:34     Вызов деструктора для класса в векторе #2
C++
1
2
for(int i = 0;i<Ships.size();i++)
    delete Ships[i];
оператор delete сам вызовет деструктор и освободит память
Для правильного удаления в базовом классе деструктор должен быть объявлен как virtual
C++
1
2
3
4
5
6
class Ship {
//....
public:
    virtual ~Ship();
//.....
};
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
19.11.2014, 12:38     Вызов деструктора для класса в векторе #3
Правильно вызывать оператор delete, но не забывайте так же делать деструктор базового класса виртуальным. И к слову не проще ли использовать умные указатели?
C++
1
vector<shared_ptr<Ship>> Ships(10);
CheburatorUA
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 24
19.11.2014, 12:48  [ТС]     Вызов деструктора для класса в векторе #4
Я может сейчас глупость спрошу, но все же.
А разве вектор после отработки не очищает автоматически выделенную память? Я думал он автоматически при отработке вызывает delete Ships[i] для всех своих членов;

Т.е. для автоматической очистки вектора необходимо использовать умный указатель как советует Ilot?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2014, 12:51     Вызов деструктора для класса в векторе
Еще ссылки по теме:

Явный вызов деструктора - C++
Есть класс Person, с полями string,string,long. Исходные данные хранятся в файле. Нужно сделать вектор объектов этого класса. ...

Явный вызов деструктора - C++
Добрый вечер всем! Я раньше читал статью о деструкторах, и там говорилось что можно явно вызвать деструктор. Статью я прочитал и забыл) И...

Повторный вызов деструктора - C++
{ bar b; b.~bar(); } В данном примере деструктор bar вызовется дважды. Как у уже удаленного объекта может вызываться...

Не понятный вызов деструктора - C++
Здравствуйте. Ситуация такая, есть класс MyClass к примеру, и при таком коде: //разные инклюды MyClass var; int WinMain(...) { ...

Двойной вызов деструктора - C++
Здравствуйте, уважаемые. Вот столкнулся с такой проблемой... CharRow - это класс, который содержит указатель на строку... ...

Автоматический вызов деструктора компилятором - C++
Хэлп, господа! Ситуация такая: имеется объект класса P, в нем парочка указателей на объекты класса С. В конструкторе P вызываются...


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

Или воспользуйтесь поиском по форуму:
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
19.11.2014, 12:51     Вызов деструктора для класса в векторе #5
CheburatorUA, вектор очищает свою память, но ваши объекты храняться не в памяти вектора. В векторе храняться указатели на выделенную память. Т.е. у вас получается двойное выделение памяти в куче. Первый раз для объектов пользовательского класса, второй для указателей, хранимых в векторе.
Yandex
Объявления
19.11.2014, 12:51     Вызов деструктора для класса в векторе
Ответ Создать тему
Опции темы

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