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

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

Войти
Регистрация
Восстановить пароль
 
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 342
#1

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

21.08.2013, 16:08. Просмотров 576. Ответов 17
Метки нет (Все метки)

Здрасти!

Подскажите пожалуйста, как вызвать дескриптор объекта 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
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,222
21.08.2013, 16:10     Как по требованию вызвать дескриптора объекта? #2
дескриптор - это деструктор?
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 342
21.08.2013, 18:14  [ТС]     Как по требованию вызвать дескриптора объекта? #4
Цитата Сообщение от VLK Посмотреть сообщение
дескриптор - это деструктор?
Само-собой Просто во время создание темы забил голову дескрипторами

Руками деструктор вызвать совсем никак нельзя?
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,222
21.08.2013, 18:22     Как по требованию вызвать дескриптора объекта? #5
C++
1
myCar.~Car();
не пробовал написать? попробуй.
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 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
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,222
21.08.2013, 18:52     Как по требованию вызвать дескриптора объекта? #8
fasked, вызывать деструктор раньше времени нет смысла, а зачем? но если автору так хочется увидеть эту надпись, я ему дал такую возможность, и не важно что деструктор в данном случае не сработал
zer0mail
2321 / 1947 / 192
Регистрация: 03.07.2012
Сообщений: 6,971
Записей в блоге: 1
21.08.2013, 19:03     Как по требованию вызвать дескриптора объекта? #9
Чотоб посмотреть, как вызовется деструктор, создай функцию demo(), в ней переменную типа Car. Потом из main вызови demo()...
Croessmah
Модератор
Эксперт CЭксперт С++
12891 / 7277 / 811
Регистрация: 27.09.2012
Сообщений: 17,976
Записей в блоге: 2
Завершенные тесты: 1
21.08.2013, 19:13     Как по требованию вызвать дескриптора объекта? #10
Цитата Сообщение от VLK Посмотреть сообщение
вызывать деструктор раньше времени нет смысла, а зачем?
Например, для ручного управления памятью
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,222
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
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
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,222
21.08.2013, 21:23     Как по требованию вызвать дескриптора объекта? #13
Hugra, тогда о какой:

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

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

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

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

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


Идет речь именно о ручном управлении памятью. Этот пример приведен для упрощения вопроса. У меня создаются несколько достаточно больших объектов и хотелось бы удалять их из памяти до завершения основной программы. Внесение этих объектов в блок - не решение. Хотелось бы именно вызвать руками деструктор.
Выделяйте память динамически, потому применяйте delete для освобождения выделенной памяти.
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,222
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
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 342
22.08.2013, 20:24  [ТС]     Как по требованию вызвать дескриптора объекта? #17
Стати
Цитата Сообщение от VLK Посмотреть сообщение
надо было еще в первом сообщении писать об управлении памятью.
тогда как было сказано надо использовать динамические объекты
Не надо было, мне нужно именно статически выделенную память очистить, сформулировано все было правильно (за исключением "дескриптор" )
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2013, 20:30     Как по требованию вызвать дескриптора объекта?
Еще ссылки по теме:

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

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

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

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