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

Как по требованию вызвать дескриптора объекта? - C++

Восстановить пароль Регистрация
 
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
21.08.2013, 16:08     Как по требованию вызвать дескриптора объекта? #1
Здрасти!

Подскажите пожалуйста, как вызвать дескриптор объекта myCar до сообщения "End of programm"?:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Car
{
public:
    Car() {cout << "Constructor active\n";}
    ~Car() {cout << "Destructor active\n";}
};
 
int main()
{
Car myCar;
//~myCar;
cout << "\nEnd of programm...\n";
return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
21.08.2013, 16:10     Как по требованию вызвать дескриптора объекта? #2
дескриптор - это деструктор?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
21.08.2013, 16:25     Как по требованию вызвать дескриптора объекта? #3
C++
1
2
3
4
5
6
7
8
int main()
{
    {
        Car myCar;
    }
    
    cout << "\nEnd of programm...\n";
}
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
21.08.2013, 18:14  [ТС]     Как по требованию вызвать дескриптора объекта? #4
Цитата Сообщение от VLK Посмотреть сообщение
дескриптор - это деструктор?
Само-собой Просто во время создание темы забил голову дескрипторами

Руками деструктор вызвать совсем никак нельзя?
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
21.08.2013, 18:22     Как по требованию вызвать дескриптора объекта? #5
C++
1
myCar.~Car();
не пробовал написать? попробуй.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.08.2013, 18:41     Как по требованию вызвать дескриптора объекта? #6
Цитата Сообщение от BESSON_off Посмотреть сообщение
Руками деструктор вызвать совсем никак нельзя?
C++
1
2
Car* obj = new Car();
delete obj;
Цитата Сообщение от VLK Посмотреть сообщение
не пробовал написать? попробуй.
ручной вызов деструктора "законный" только в случае placement new
C++
1
2
3
char buf[sizeof(Car)];
Car* obj = new (buf) Car();
obj->~Car();
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
21.08.2013, 18:47     Как по требованию вызвать дескриптора объекта? #7
Цитата Сообщение от VLK Посмотреть сообщение
не пробовал написать? попробуй.
Только тогда деструктор будет два раза вызван: до "end of program" и после. Чтобы деструктор вызвать явно и только один раз, то придется использоваться placement new:
C++
1
2
3
4
void* buffer = malloc(sizeof(Car));
Car* car = new(buffer) Car();
car->~Car(); 
free(buffer);
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
21.08.2013, 18:52     Как по требованию вызвать дескриптора объекта? #8
fasked, вызывать деструктор раньше времени нет смысла, а зачем? но если автору так хочется увидеть эту надпись, я ему дал такую возможность, и не важно что деструктор в данном случае не сработал
zer0mail
2177 / 1860 / 187
Регистрация: 03.07.2012
Сообщений: 6,621
Записей в блоге: 1
21.08.2013, 19:03     Как по требованию вызвать дескриптора объекта? #9
Чотоб посмотреть, как вызовется деструктор, создай функцию demo(), в ней переменную типа Car. Потом из main вызови demo()...
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,842
Записей в блоге: 2
Завершенные тесты: 1
21.08.2013, 19:13     Как по требованию вызвать дескриптора объекта? #10
Цитата Сообщение от VLK Посмотреть сообщение
вызывать деструктор раньше времени нет смысла, а зачем?
Например, для ручного управления памятью
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
21.08.2013, 19:21     Как по требованию вызвать дескриптора объекта? #11
Croessmah,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Car
{
public:
    Car() {cout << "Constructor active\n";}
    ~Car() {cout << "Destructor active\n";}
};
 
int main()
{
Car myCar;
 
myCar.~Car();
 
cout << "\nEnd of programm...\n";
return 0;
}
после выполнения строчки 12 объект myCar будет уничтожен или нет?
Hugra
 Аватар для Hugra
47 / 47 / 1
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
21.08.2013, 20:54     Как по требованию вызвать дескриптора объекта? #12
Цитата Сообщение от VLK Посмотреть сообщение
Croessmah,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Car
{
public:
    Car() {cout << "Constructor active\n";}
    ~Car() {cout << "Destructor active\n";}
};
 
int main()
{
Car myCar;
 
myCar.~Car();
 
cout << "\nEnd of programm...\n";
return 0;
}
после выполнения строчки 12 объект myCar будет уничтожен или нет?
После выполнения строчки 12, будет вызван деструктор объекта, объект никуда не денется.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
21.08.2013, 21:23     Как по требованию вызвать дескриптора объекта? #13
Hugra, тогда о какой:

Цитата Сообщение от Croessmah Посмотреть сообщение
Например, для ручного управления памятью

идет речь, если объект ни куда не девается.

PS речь идет о конкретном примере, создание динамических объектов, которые буду действительно удалены, это уже совсем другой разговор.
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
22.08.2013, 16:59  [ТС]     Как по требованию вызвать дескриптора объекта? #14
Цитата Сообщение от VLK Посмотреть сообщение
myCar.~Car();
В этом случае деструктор 2 раза вызывается... почему то...

Цитата Сообщение от VLK Посмотреть сообщение
идет речь, если объект ни куда не девается.
Идет речь именно о ручном управлении памятью. Этот пример приведен для упрощения вопроса. У меня создаются несколько достаточно больших объектов и хотелось бы удалять их из памяти до завершения основной программы. Внесение этих объектов в блок - не решение. Хотелось бы именно вызвать руками деструктор.

Цитата Сообщение от Jupiter Посмотреть сообщение
ручной вызов деструктора "законный" только в случае placement new
Не увидел это сообщение. Видимо это так и есть... буду пользоваться указателями. Спасибо
Hugra
 Аватар для Hugra
47 / 47 / 1
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
22.08.2013, 17:02     Как по требованию вызвать дескриптора объекта? #15
Цитата Сообщение от BESSON_off Посмотреть сообщение
В этом случае деструктор 2 раза вызывается... почему то...


Идет речь именно о ручном управлении памятью. Этот пример приведен для упрощения вопроса. У меня создаются несколько достаточно больших объектов и хотелось бы удалять их из памяти до завершения основной программы. Внесение этих объектов в блок - не решение. Хотелось бы именно вызвать руками деструктор.
Выделяйте память динамически, потому применяйте delete для освобождения выделенной памяти.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
22.08.2013, 17:50     Как по требованию вызвать дескриптора объекта? #16
BESSON_off, надо было еще в первом сообщении писать об управлении памятью.

тогда как было сказано надо использовать динамические объекты, т.е.:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Car
{
public:
    Car() {cout << "Constructor active\n";}
    ~Car() {cout << "Destructor active\n";}
};
 
int main()
{
Car *myCar = new Car; // оператор new выделяет память под объект
delete myCar; // это будет за место - ~myCar(); оператор delete удаляет объект, высвобождает память
cout << "\nEnd of programm...\n";
return 0;
}
BESSON_off
 Аватар для BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 329
22.08.2013, 20:24  [ТС]     Как по требованию вызвать дескриптора объекта? #17
Стати
Цитата Сообщение от VLK Посмотреть сообщение
надо было еще в первом сообщении писать об управлении памятью.
тогда как было сказано надо использовать динамические объекты
Не надо было, мне нужно именно статически выделенную память очистить, сформулировано все было правильно (за исключением "дескриптор" )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2013, 20:30     Как по требованию вызвать дескриптора объекта?
Еще ссылки по теме:

C++ Выдать на печать по требованию информацию
C++ Передача дескриптора текущего процесса через mailslot
C++ Как вызвать другой конструктор для уже созданного объекта конструктором по умолчанию?

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

Или воспользуйтесь поиском по форуму:
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
22.08.2013, 20:30     Как по требованию вызвать дескриптора объекта? #18
BESSON_off, статически выделенную память можно очистить только выйдя из программы.
Yandex
Объявления
22.08.2013, 20:30     Как по требованию вызвать дескриптора объекта?
Ответ Создать тему
Опции темы

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