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

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

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

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

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

Как вызвать метод объекта из контейнера? - C++
Есть абстрактный класс E, производный от CObject, в нем чистая виртуальная войдовская функция. Создал динамические объекты классов, которые...

Как вызвать конструктор для неизвестного объекта? - C++
Добрый вечер. Помогите мне с задачей. Хочу написать шаблонный класс вектор. И в конструкторе по умолчанию нужно прописать конструкцию...

Как вызвать прегруженный const метод для статического объекта - C++
class A { public: A() { cout &lt;&lt; &quot;A()&quot; &lt;&lt; endl; } ~A() { cout &lt;&lt; &quot;~A()&quot; &lt;&lt; endl; } void foo() { cout &lt;&lt; &quot;foo 1_1&quot;; } ...

Как вызвать другой конструктор для уже созданного объекта конструктором по умолчанию? - C++
Есть класс в котором несколько конструкторов, Мне в некоторых местах нужно создавать объекты класса с конструктором по умолчанию для...

Как в классе А у объекта класса B вызвать метод класса B ? - C++
Есть Класс A и класс B . В классе B лежит объект типа ArrayList , назовём его arrayList, в этом же классе есть метод push() . Возможно ли в...

Спрятать указатель на функцию класса в map и вызвать из другого объекта - C++
Товарищи, пишу примитивный &quot;tcp-сервер&quot;. В его задачи входит принятие соединений и получение сообщений. В зависимости от сообщения &quot;сервер&quot;...

17
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
21.08.2013, 16:10 #2
дескриптор - это деструктор?
0
fasked
Эксперт С++
4957 / 2537 / 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";
}
0
BESSON_off
3 / 0 / 1
Регистрация: 08.07.2013
Сообщений: 351
21.08.2013, 18:14  [ТС] #4
Цитата Сообщение от VLK Посмотреть сообщение
дескриптор - это деструктор?
Само-собой Просто во время создание темы забил голову дескрипторами

Руками деструктор вызвать совсем никак нельзя?
0
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
21.08.2013, 18:22 #5
C++
1
myCar.~Car();
не пробовал написать? попробуй.
0
Jupiter
Каратель
Эксперт С++
6564 / 3985 / 227
Регистрация: 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();
1
fasked
Эксперт С++
4957 / 2537 / 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);
0
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
21.08.2013, 18:52 #8
fasked, вызывать деструктор раньше времени нет смысла, а зачем? но если автору так хочется увидеть эту надпись, я ему дал такую возможность, и не важно что деструктор в данном случае не сработал
0
zer0mail
2393 / 2025 / 201
Регистрация: 03.07.2012
Сообщений: 7,342
Записей в блоге: 1
21.08.2013, 19:03 #9
Чотоб посмотреть, как вызовется деструктор, создай функцию demo(), в ней переменную типа Car. Потом из main вызови demo()...
0
Croessmah
Ушел
Эксперт CЭксперт С++
13565 / 7716 / 873
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
21.08.2013, 19:13 #10
Цитата Сообщение от VLK Посмотреть сообщение
вызывать деструктор раньше времени нет смысла, а зачем?
Например, для ручного управления памятью
0
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
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 будет уничтожен или нет?
0
Hugra
48 / 48 / 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, будет вызван деструктор объекта, объект никуда не денется.
0
VLK
194 / 163 / 12
Регистрация: 05.05.2013
Сообщений: 1,196
21.08.2013, 21:23 #13
Hugra, тогда о какой:

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

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

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

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

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


Идет речь именно о ручном управлении памятью. Этот пример приведен для упрощения вопроса. У меня создаются несколько достаточно больших объектов и хотелось бы удалять их из памяти до завершения основной программы. Внесение этих объектов в блок - не решение. Хотелось бы именно вызвать руками деструктор.
Выделяйте память динамически, потому применяйте delete для освобождения выделенной памяти.
0
22.08.2013, 17:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2013, 17:02
Привет! Вот еще темы с ответами:

Как правильно вызывать функцию объекта из другой функции того же объекта? - C++
Доброго дня и ночи, уважаемые программисты! Существует некоторая проблема, на которую я наткнулся, решая задачу по программированию из...

Выдать на печать по требованию информацию - C++
Создать файл, содержащий сведения о количестве изделий А,В,С, собранных рабочим за месяц. Структура записи имеет поля: фамилия сборщика,...

Почему не останавливается цикл по требованию? - C++
Здравствуйте! Интересует вопрос по теме. for (int i = 2; !flag; ++i) { if (cin.get() == 'q') flag...

Как вызвать функцию объекта Parent из вложенного объекта - Delphi
Уважаемые эксперты. Подскажите пожалуйста как решить проблему. Есть несколько пользовательских компонентов, динамически создающихся...


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

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

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