Модераторы: 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   Вверх
apook
Дата 24.9.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Если в одной функции являющейся членом класса произошел ошибка и вызвана функция error(не являющяяся членом какого-либо класса вообще) которая после сообщения об ошибке производит exit( 1 ); то деструктор не сробатывает.  Что лучше сделать чтоб срабатывал деструктор? 


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
bsa
Дата 24.9.2007, 15:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(apook @ 24.9.2007,  15:24)
Если в одной функции являющейся членом класса произошел ошибка и вызвана функция error(не являющяяся членом какого-либо класса вообще) которая после сообщения об ошибке производит exit( 1 ); то деструктор не сробатывает.  Что лучше сделать чтоб срабатывал деструктор?

Пользоваться исключениями.
PM   Вверх
rukudias
Дата 24.9.2007, 22:45 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ну умники продолжаем?
Код

#include <iostream>
using namespace std;
class a
{
public:
    a()
    {
    }
    ~a()
    {
        cout<<"dead"<<endl;
    }
    void sets()
    {
                       cout<<"umniki"<<endl;
    }
};
void main()
{
    a myobj;
    a myobj2;
    myobj.~a();
                myobj.sets();

}

Че будет? smile 
PM MAIL   Вверх
Daevaorn
Дата 24.9.2007, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(rukudias @  24.9.2007,  23:45 Найти цитируемый пост)
Че будет? smile  

Ошибка компиляции. main должен возвращать int. Если эту оплошность исправить то
Цитата

dead
umniki
dead
dead

PM MAIL WWW   Вверх
rukudias
Дата 25.9.2007, 07:40 (ссылка)    | (голосов:7) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Скорее ошыбку в ДНК! smile 
PM MAIL   Вверх
Daevaorn
Дата 25.9.2007, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(rukudias @  25.9.2007,  08:40 Найти цитируемый пост)
Скорее ошыбку в ДНК! smile  

по теме сказать нечего?
PM MAIL WWW   Вверх
rukudias
Дата 25.9.2007, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



какже нечего есть чего!
Сюдя я  из преведеных мною примеров я далаю вывод
что деструктор это функция которая вызывается при удалении 
обьекта а не функция которая удаляет обьект!
вот поэтому прокатует вызов метода класса после вызова деструктора явно

Знаю умники начнут умнучать типа если ты вдеструкторе удалиш свойсвта этого класса то
привызове методов использ эти свойстя будет ерор что в принципе и ежу понятно !
Всем спасибо!
Ведро извене ний за грубые слова.  smile 
PM MAIL   Вверх
archimed7592
Дата 26.9.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Цитата(rukudias @  25.9.2007,  23:39 Найти цитируемый пост)
Сюдя я  из преведеных мною примеров я далаю вывод
что деструктор это функция которая вызывается при удалении 
обьекта а не функция которая удаляет обьект!

В следующий раз открой книгу и сделай вывод, прочитав пару страниц.

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

Негоже обращаться в таком тоне к людям у которых просишь помощи >:o.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 26.9.2007, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



rukudias, 

M
MAKCim
Модератор: следите за своими словами



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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