Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Несколько вопросов по C++ -- конструкторы и деструкторы / 12 сообщений из 12, страница 1 из 1
08.10.2015, 01:59
    #39071398
stut
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по C++ -- конструкторы и деструкторы
Вот был вопрос о виртуальном деструкторе. Но если мы ставим ключевое слово виртуал перед деструктором базового класа, почему он должен быть дестуктором и класов наследников -- освобождать память и из под них. Если мы пишет виртуал перед функцией она как раз может или должна переопределяться в класе-наследнике?? Или здесь просто такая конвенция о виртуальном деструкторе? И вообще понятие деструктора в С++ одно из самых мне не очень понятных. Вот мы после обьявление класа пишем его конструктор (предназначен для выделение памяти и создание обьектов класа), а после него пишем его деструктор -- он что предполагает освобождение памяти и уничтожение обьекта -- при любом его создание? Но когда этот деструктор применяется -- когда обьект выходи из "игры"? Применяются ли здесь правила что выделение и уничтожение выделенной памяти должно иметь место в одном блоке (функции)?
...
Рейтинг: 0 / 0
08.10.2015, 12:38
    #39071825
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по C++ -- конструкторы и деструкторы
stutВот был вопрос о виртуальном деструкторе. Но если мы ставим ключевое слово виртуал перед деструктором базового класа, почему он должен быть дестуктором и класов наследников -- освобождать память и из под них.


Вообще-то дектруктор не освобождает память. Дектруктор выполняет деинициализацию объекта.
Память удаляет оператор delete.

stut Если мы пишет виртуал перед функцией она как раз может или должна переопределяться в класе-наследнике??


virtual без =0 само по себе никак не влияет на возможность или обязательность переопределения функции, помеченной этим ключевым словом, в наследниках класса.

virtual с =0 обязывает наследников переопределить метод хотя бы в одном из наследников.

stut Или здесь просто такая конвенция о виртуальном деструкторе? И вообще понятие деструктора в С++ одно из самых мне не очень понятных.


Что ж там непонятного ? Концепция конструктора ясна ? Деструктор -- это конструктор наоборот.
Конструктор конструирует (инициализирует) объект, деструктор -- деинициализирует объект.
Ещё раз, ни та, ни другая операции не связаны никак с выделением и освобождением памяти.

stutВот мы после обьявление класа пишем его конструктор (предназначен для выделение памяти и создание обьектов класа), а после него пишем его деструктор -- он что предполагает освобождение памяти и уничтожение обьекта -- при любом его создание?

Не устану повторять: конструктор и дектруктор никак не связаны с работой с памятью.
Объект может находится в любой памяти, например, автоматической, и независимо от этого его конструктор и деструктор будут вызваны.

stut Но когда этот деструктор применяется -- когда обьект выходи из "игры"? Применяются ли здесь правила что выделение и уничтожение выделенной памяти должно иметь место в одном блоке (функции)?

Конструктор и дектруктор никак не связаны с работой с памятью.

Выделение и уничтожение динамической памяти не обязано быть в одном блоке программы, иначе в ней не было бы никакого смысла, она полностью повторяла бы поведение автоматической памяти.
...
Рейтинг: 0 / 0
08.10.2015, 13:02
    #39071867
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по C++ -- конструкторы и деструкторы
stutНо когда этот деструктор применяется -- когда обьект выходи из "игры"?
Деструктор срабатывает когда заканчивается область видимости объекта.
Запусти
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
class test {
	int x;
public:
	test(int i);
	~test();
};

test::test(int i)
{
	x = i;
	printf("Constructor %d\n", x);
}

test::~test()
{
	printf("Destructor %d\n", x);
}

int main () {
	printf("1\n");
	test t1(1);
	printf("2\n");
	{
		test t2(2);
	}
	printf("3\n");
	return 0;
}

...
Рейтинг: 0 / 0
08.10.2015, 14:29
    #39071985
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по C++ -- конструкторы и деструкторы
Dima TstutНо когда этот деструктор применяется -- когда обьект выходи из "игры"?
Деструктор срабатывает когда заканчивается область видимости объекта.

Да ладно!

Запусти
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
class test {
	int x;
public:
	test(int i);
	~test();
};

test::test(int i)
{
	x = i;
	printf("Constructor %d\n", x);
}

test::~test()
{
	printf("Destructor %d\n", x);
}

int main () {
	printf("1\n");
	static test t1(1);
	printf("2\n");
	{
		test t2(2);
	}
	printf("3\n");
	return 0;
}



Не путай область видимости и время жизни.
...
Рейтинг: 0 / 0
08.10.2015, 14:41
    #39072000
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по C++ -- конструкторы и деструкторы
stutВот был вопрос о виртуальном деструкторе. Но если мы ставим ключевое слово виртуал перед деструктором базового класа, почему он должен быть дестуктором и класов наследников -- освобождать память и из под них. Если мы пишет виртуал перед функцией она как раз может или должна переопределяться в класе-наследнике?? Или здесь просто такая конвенция о виртуальном деструкторе? И вообще понятие деструктора в С++ одно из самых мне не очень понятных. Вот мы после обьявление класа пишем его конструктор (предназначен для выделение памяти и создание обьектов класа), а после него пишем его деструктор -- он что предполагает освобождение памяти и уничтожение обьекта -- при любом его создание? Но когда этот деструктор применяется -- когда обьект выходи из "игры"? Применяются ли здесь правила что выделение и уничтожение выделенной памяти должно иметь место в одном блоке (функции)?

Виртуальный деструктор нужен для правильной работы delele, когда тип объекта приведен к его базовому типу.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
class A;
class B: A;
...
B *b = new B;
...
A *a =  b;
...
delete a;  // Если A::~A не сделать виртуальным, delete вызовет A::~A(), вместо B::~B().



Обычно, конструктор выделяет память для членов класса, деструктор её освобождает. Но память может выделяться в других методах класса. Это т.н. ленивая инициализация.
...
Рейтинг: 0 / 0
08.10.2015, 15:50
    #39072092
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по C++ -- конструкторы и деструкторы
mcureenab
Виртуальный деструктор нужен для правильной работы delele, когда тип объекта приведен к его базовому типу.



Когда тип ссылки (в общем смысле) на объект приведён к типу ссылки на базовый тип.
(ссылка в общем смысле, т.е. в С++ это -- указатель или ссылка С++).
...
Рейтинг: 0 / 0
08.10.2015, 17:01
    #39072209
mcureenab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по C++ -- конструкторы и деструкторы
stutдеструктор -- он что предполагает освобождение памяти и уничтожение обьекта -- при любом его создание? Но когда этот деструктор применяется -- когда обьект выходи из "игры"? Применяются ли здесь правила что выделение и уничтожение выделенной памяти должно иметь место в одном блоке (функции)?

Для automatic объектов, деструктор вызывается автоматически, когда завершается время жизни объекта. Обычно это происходит, так бы сказать, после return; но перед }.

Код: plaintext
1.
2.
3.
4.
5.
6.
void f () {
Foo b; //  automatic объект. Как правило размещается в стеке.
...
return;
// Тут произойдет автоматический вызов деструктора b, и затем b уйдет из стека.
} // Тут управление вернется в вызывающий код



Для static объектов вызов деструктора происходит автоматически перед завершением процесса.

Для dynamic объектов вызов деструктора происходит автоматически из оператора delete перед удалением b из кучи.

Кроме того, если у вас уже есть буфер для размещения объекта, конструктор можно вызывать явно но без выделения памяти. Тогда вызов деструктора будет вашей обязанностью.

Код: plaintext
1.
2.
3.
4.
char buf[sizeof(Foo)];
Foo *f = new (buf) Foo();
....
f->Foo::~Foo();
...
Рейтинг: 0 / 0
08.10.2015, 20:00
    #39072374
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по C++ -- конструкторы и деструкторы
mcureenabНе путай область видимости и время жизни.
Согласен. Навеяно другими языками, где эти понятия совпадают. В Си оно сложнее устроено.

PS Пример мой ты криво поправил, ничего не поменялось, надо было static для t2 добавлять.
...
Рейтинг: 0 / 0
08.10.2015, 20:10
    #39072382
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по C++ -- конструкторы и деструкторы
Dima TНавеяно другими языками, где эти понятия совпадают.
примеры - в студию!
...
Рейтинг: 0 / 0
08.10.2015, 20:13
    #39072384
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по C++ -- конструкторы и деструкторы
ИзопропилDima TНавеяно другими языками, где эти понятия совпадают.
примеры - в студию!
Пожалуйста, Visual FoxPro
Код: plaintext
1.
loObj = NewObject("MyClass", "MyLib")
...
Рейтинг: 0 / 0
08.10.2015, 20:25
    #39072390
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по C++ -- конструкторы и деструкторы
Dima T,

foxpro для уничтожения объектов использует подсчёт ссылок
...
Рейтинг: 0 / 0
08.10.2015, 20:47
    #39072398
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несколько вопросов по C++ -- конструкторы и деструкторы
ИзопропилDima T,

foxpro для уничтожения объектов использует подсчёт ссылок
Затестил. Согласен, заблуждался. Ни разу не применял. Живу в парадигмах ФП.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Несколько вопросов по C++ -- конструкторы и деструкторы / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]