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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> деструктор по умолчанию 
V
    Опции темы
boostcoder
Дата 28.11.2011, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



такой код:
Код

struct type {
};

int main() {
   type* p = new type;
   p->~type();
}

http://liveworkspace.org/code/5bdbe54ebc9f...831474f53d46993
успешно компилятся.

но не ясным становится вопрос, что выполняет дефолтный деструктор? с дефолтным конструктором все понятно.

Это сообщение отредактировал(а) boostcoder - 28.11.2011, 18:16
PM WWW   Вверх
Alca
Дата 28.11.2011, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

дефолтный деструктор

а что их несколько, деструкторов?

Это сообщение отредактировал(а) Alca - 28.11.2011, 18:28


--------------------
PM WWW ICQ Skype Jabber   Вверх
baldina
Дата 28.11.2011, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Alca @  28.11.2011,  18:27 Найти цитируемый пост)
а что их несколько, деструкторов?

имеется в виду сгенеренный по умолчанию

Цитата(boostcoder @  28.11.2011,  18:07 Найти цитируемый пост)
что выполняет дефолтный деструктор? с дефолтным конструктором все понятно

то же, что и дефолтный конструктор, только в обратном порядке)))

PM MAIL   Вверх
boostcoder
Дата 28.11.2011, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(baldina @  28.11.2011,  18:31 Найти цитируемый пост)
то же, что и дефолтный конструктор, только в обратном порядке)))

просто с дефолтным конструктором встречаешь ежедневно. а вот о дефолтном деструкторе задумался впервые smile 
PM WWW   Вверх
borisbn
Дата 28.11.2011, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(boostcoder @  28.11.2011,  18:07 Найти цитируемый пост)
что выполняет дефолтный деструктор? 

вызывает по-очереди деструкторы всех членов класса. нет ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 28.11.2011, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(boostcoder @  28.11.2011,  17:07 Найти цитируемый пост)
 что выполняет дефолтный деструктор? 

а вот гораздо интереснее, на мой взгляд smile

Код


#include <iostream>

struct type * create_type ();


int main() {
   type* p = create_type ();   
   delete p;
}

struct type {  ~type () {   std::cout<<"!!"<<std::endl;  } };

type * create_type () {   return new type (); }




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


Эксперт
****


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

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



Цитата(borisbn @  28.11.2011,  18:47 Найти цитируемый пост)
вызывает по-очереди деструкторы всех членов класса.

нет. их вызов обеспечивает компилятор. кстати, если деструктор не дефолтный, деструкторы не вызываются штоли?
http://codepad.org/Uj0iCGWy

Цитата(mes @  28.11.2011,  21:34 Найти цитируемый пост)
а вот гораздо интереснее, на мой взгляд

ничего особенного. компилятор не может вызвать деструктор, т.к. класс недоопределен. это, кстати, известная проблема: вроде бы работа происходит только с указателями, однако вызов delete требует описание класса. именно из-за необходимости вызова деструктора.

Добавлено через 2 минуты и 14 секунд
зато http://codepad.org/bdTI0l1y
;-)
PM MAIL   Вверх
mes
Дата 28.11.2011, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(baldina @  28.11.2011,  21:22 Найти цитируемый пост)
 это, кстати, известная проблема

да известная.. просто я не понял зачем тс создал тему и поэтому решил немножко е ерасширить smile

Цитата(baldina @  28.11.2011,  21:22 Найти цитируемый пост)
ничего особенного. компилятор не может вызвать деструктор, т.к. класс недоопределен.

но деструктор вызывается smile только не тот что надо  smile 





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


Эксперт
****


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

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



Цитата(mes @  28.11.2011,  22:38 Найти цитируемый пост)
но деструктор вызывается  только не тот что надо   

Студия деструктор не вызывает, о чем честно сообщает в ворнинге:
Код

warning C4150: deletion of pointer to incomplete type 'type'; no destructor called : see declaration of 'type'

PM MAIL   Вверх
baldina
Дата 29.11.2011, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(mes @  28.11.2011,  22:38 Найти цитируемый пост)
но деструктор вызывается  только не тот что над

g++ 4.1.2 -std=c++98 не компилирует, говорит incomplete type

вообще ввиду того что интерфейс деструктора неизменен, и он есть всегда, можно было бы решить этот вопрос на стадии линковки, однако стандарт определяет по-другому. 
Цитата

5.3.5.5 If the object being deleted has incomplete class type at the point of deletion and the complete class has a non-trivial
destructor or a deallocation function, the behavior is undefined.

видимо тут дело в возможном наличии нестандартного operator delete(), и хотя явно к деструктору не относится, результат тот, что мы имеем
PM MAIL   Вверх
math64
Дата 29.11.2011, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(baldina @  29.11.2011,  11:39 Найти цитируемый пост)
вообще ввиду того что интерфейс деструктора неизменен, и он есть всегда, можно было бы решить этот вопрос на стадии линковки

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

PM   Вверх
baldina
Дата 29.11.2011, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(math64 @  29.11.2011,  12:34 Найти цитируемый пост)
Нельзя, потому что деструктор может быть виртульным и не виртуальным, и код приэтом генерируется разный.

не, это не причина. если деструктор виртуальный, то его код будет отличаться (как кстати и код конструктора класса, имеющего vtable)
PM MAIL   Вверх
math64
Дата 29.11.2011, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Если у структуры/класса нет полей, требующих вызова деструктора и нет виртуального деструктора - его вызов - ничего не делать.
Если есть виртуальный деструктор - его вызов - найти vtable (нужно знать смещение), найти в ней указатель на деструктор (опять же, нужно знать смещение) - код вызова разный.
И только если деструктор не виртуальный и не пустой, будет вызов одинаковый.
PM   Вверх
baldina
Дата 29.11.2011, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



я видимо не совсем понятно выразился. в силу 5.3.5.5 компилятор может оптимизировать вызов деструктора, помещая поиск в vtable за его пределы. так обычно и сделано, и Вы правы. в случае недоопределенного класса компилятор либо ругается либо не вызывает деструктор (возможно, с предупреждением об этом).
я же имел в виду, что технически поиск в по vtable можно встроить в деструктор, ссылка на который разрешалась бы во время линковки.
так и было бы сделано, если отменить 5.3.5.5. правда, в этом случае оптимизация была бы затруднена, но это проблема разработчиков компиляторов))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1010 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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