Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
BESSON_off
3 / 0 / 7
Регистрация: 08.07.2013
Сообщений: 351
#1

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

21.08.2013, 16:08. Просмотров 639. Ответов 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++):

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

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

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

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

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

Вызвать функцию класса без создания объекта
Можно ли так сделать? Точнее я знаю что можно, но у меня не получается, я хочу...

17
VLK
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,197
21.08.2013, 16:10 #2
дескриптор - это деструктор?
0
fasked
Эксперт С++
4976 / 2556 / 241
Регистрация: 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 / 7
Регистрация: 08.07.2013
Сообщений: 351
21.08.2013, 18:14  [ТС] #4
Цитата Сообщение от VLK Посмотреть сообщение
дескриптор - это деструктор?
Само-собой Просто во время создание темы забил голову дескрипторами

Руками деструктор вызвать совсем никак нельзя?
0
VLK
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,197
21.08.2013, 18:22 #5
C++
1
myCar.~Car();
не пробовал написать? попробуй.
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 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
Эксперт С++
4976 / 2556 / 241
Регистрация: 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
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,197
21.08.2013, 18:52 #8
fasked, вызывать деструктор раньше времени нет смысла, а зачем? но если автору так хочется увидеть эту надпись, я ему дал такую возможность, и не важно что деструктор в данном случае не сработал
0
zer0mail
2451 / 2085 / 216
Регистрация: 03.07.2012
Сообщений: 7,566
Записей в блоге: 1
21.08.2013, 19:03 #9
Чотоб посмотреть, как вызовется деструктор, создай функцию demo(), в ней переменную типа Car. Потом из main вызови demo()...
0
Croessmah
++Ͻ
14161 / 8086 / 1513
Регистрация: 27.09.2012
Сообщений: 19,926
Записей в блоге: 3
Завершенные тесты: 1
21.08.2013, 19:13 #10
Цитата Сообщение от VLK Посмотреть сообщение
вызывать деструктор раньше времени нет смысла, а зачем?
Например, для ручного управления памятью
0
VLK
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,197
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 / 9
Регистрация: 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
195 / 164 / 19
Регистрация: 05.05.2013
Сообщений: 1,197
21.08.2013, 21:23 #13
Hugra, тогда о какой:

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

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

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

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

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


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

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

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

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

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


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

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

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