Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Явный вызов деструктора 
:(
    Опции темы
rukudias
Дата 22.9.2007, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 28.2.2007

Репутация: 0
Всего: 0



Прет!
есть код
Код

#include <iostream>
using namespace std;
class a
{
public:
     a()
     {
     }
     ~a()
     {
          cout<<"dead"<<endl;
     }
     void sets()
     {
     }
};
void main()
{
     a myobj;
     a().sets();
     myobj.~a();
}
прокоментируйте результат работы! :crazy 

PM MAIL   Вверх
zkv
Дата 22.9.2007, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(rukudias @  22.9.2007,  21:51 Найти цитируемый пост)
Прет!

и правда кого-то прет  smile

Добавлено через 38 секунд
Это тест или что? Объяснить надо что-то?
PM MAIL   Вверх
Evgen24
Дата 22.9.2007, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 31.7.2007
Где: Россия

Репутация: нет
Всего: нет



Результат работы надпись: dead

PM MAIL ICQ   Вверх
nickless
Дата 22.9.2007, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата
Явный вызов деструктора
... делать не нужно smile 


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Lazin
Дата 22.9.2007, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Память освобождена не будет, если ты об этом.
PM MAIL Skype GTalk   Вверх
zkv
Дата 22.9.2007, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Lazin @  22.9.2007,  22:35 Найти цитируемый пост)
Память освобождена не будет, если ты об этом.

а ее не выделял никто.

Понял фишку вопроса:
Код

#include <iostream>
using namespace std;
class a
{
public:
     a()
     {
     }
     ~a()
     {
          cout<<"dead"<<endl;
     }
     void sets()
     {
     }
};
void main()
{
     a myobj;
     a().sets();
     //вызов деструктора для a()
     myobj.~a();     //вызов деструктора для myobj
}//вызов деструктора для myobj

те а() будет уничтожен раньше чем явно будет вызван деструктор для myobj...
Видимо для а() создается свой локальный scope, что вполне логично, все равно к объекту обратиться нельзя будет.

Это сообщение отредактировал(а) zkv - 22.9.2007, 22:47
PM MAIL   Вверх
UnrealMan
Дата 22.9.2007, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(zkv @  22.9.2007,  23:42 Найти цитируемый пост)
Видимо для а() создается свой локальный scope

Ничего для него не создаётся. Это обычный временный объект, который, согласно правилам, живёт до окончания вычисления full expression, т.е. a().sets()
PM MAIL   Вверх
zkv
Дата 22.9.2007, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(UnrealMan @  22.9.2007,  22:47 Найти цитируемый пост)
Это обычный временный объект, который, согласно правилам, живёт до окончания вычисления full expression, т.е. a().sets() 

да, необычный вид смутил...
Я, честно говоря, не знал что можно просто взять и написать в программе: 
Код

a(); 

PM MAIL   Вверх
UnrealMan
Дата 22.9.2007, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Ну, вообще говоря, если T - тип, то T() - это необязательно временный объект. Всё зависит от контекста.
PM MAIL   Вверх
zkv
Дата 22.9.2007, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(UnrealMan @  22.9.2007,  23:02 Найти цитируемый пост)
то T() - это необязательно временный объект

например new T()? И еще есть варианты?
PM MAIL   Вверх
UnrealMan
Дата 22.9.2007, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Код

template <class T>
    struct A
{
};

int main()
{
    A<int()>();
}

Здесь int() - это не выражение, а тип (функция, не принимающая аргументов и возращающая int).

Добавлено через 4 минуты и 10 секунд
Ещё пример:

Код

sizeof int(); // здесь int() - выражение
sizeof(int()); // здесь int() - тип (не откомпилируется)

PM MAIL   Вверх
rukudias
Дата 23.9.2007, 00:38 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 28.2.2007

Репутация: 0
Всего: 0



Мдя!
А хто из выше писавщих debugил код???? smile 
так вот господа 
согласно коду создается ДВА обьекта класса а.
а согласно выводу в консоль деструктор вызовется  ТРИЖДЫ!
проверьте если не верете
прокоменрируйте почему?
PM MAIL   Вверх
nickless
Дата 23.9.2007, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(rukudias @  22.9.2007,  23:38 Найти цитируемый пост)
прокоменрируйте почему? 

потому что
Цитата(nickless @  22.9.2007,  21:33 Найти цитируемый пост)
Цитата

Явный вызов деструктора
... делать не нужно


myobj создаётся в стеке, и деструктор его вызвается автоматически (в данном случае после выхода из main).
С более сложными классами такие действия обычно приводят к коредампам и прочим зегфолтам (ну если луна в козероге то иногда обходится...) smile 

Это сообщение отредактировал(а) nickless - 23.9.2007, 00:58


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
zkv
Дата 23.9.2007, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(rukudias @  23.9.2007,  00:38 Найти цитируемый пост)
а согласно выводу в консоль деструктор вызовется  ТРИЖДЫ!
проверьте если не верете
прокоменрируйте почему? 

уже давно все обсудили  smile 
PM MAIL   Вверх
Daevaorn
Дата 23.9.2007, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(rukudias @  23.9.2007,  01:38 Найти цитируемый пост)
А хто из выше писавщих debugил код???? 

а разве это нужно делать чтобы объяснить работу нескольких простых строчек?;)
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0609 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.