Деструктор по умолчанию и пустой деструктор
От: Максим Рогожин Россия  
Дата: 24.08.11 13:28
Оценка:
Привет!

Деструктор по умолчанию и пустой деструктор

class X {
public:
   ~X() {} // пустой деструктор
};


это одно и тоже? Или бывают ситуации, когда есть разница?

Заранее благодарен!
Re: Деструктор по умолчанию и пустой деструктор
От: Pavel Dvorkin Россия  
Дата: 24.08.11 13:45
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

МР>это одно и тоже? Или бывают ситуации, когда есть разница?


Пустой деструктор может быть виртуальным, что приведет к его виртуальности у всех наследников. Деструктор по умлочанию невиртуальный.
With best regards
Pavel Dvorkin
Re: Деструктор по умолчанию и пустой деструктор
От: McQwerty Россия  
Дата: 24.08.11 13:46
Оценка: 2 (1) +1
Здравствуйте, Максим Рогожин, Вы писали:

МР>Привет!


МР>Деструктор по умолчанию и пустой деструктор


МР>
МР>class X {
МР>public:
МР>   ~X() {} // пустой деструктор
МР>};
МР>


МР>это одно и тоже? Или бывают ситуации, когда есть разница?


МР>Заранее благодарен!


Удалось найти разницу вот так:

struct base
{
    virtual ~base () throw () { }
};

struct derived: base
{
    ~derived () { } //  Если эту строку закомментировать, то не ругается
};

int main (int, char**)
{
    derived d;
}


Ругается так:

Line 8: error: looser throw specifier for 'virtual derived::~derived()'
compilation terminated due to -Wfatal-errors.

Re: Деструктор по умолчанию и пустой деструктор
От: jazzer Россия Skype: enerjazzer
Дата: 24.08.11 15:15
Оценка:
Здравствуйте, Максим Рогожин, Вы писали:

МР>это одно и тоже? Или бывают ситуации, когда есть разница?


http://www.rsdn.ru/article/cpp/LittleDetail.xml
Автор(ы): Александр Насонов
Дата: 28.11.2004
Статья о решении проблем, возникающих в, казалось бы, тривиальных ситуациях при использовании mixin-класса.


jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Деструктор по умолчанию и пустой деструктор
От: Masterkent  
Дата: 24.08.11 15:30
Оценка: 35 (4) +2
Явно определённый с пустым телом деструктор никогда не является тривиальным. Неявно определённый деструктор может быть тривиальным.

struct X {};

struct Y
{
    ~Y() {}
};

void fx()
{
    goto L; // OK
    X x;
L:
    ;
}

void fy()
{
    goto L; // ошибка в соответствии с 6.7/3
    Y y;
L:
    ;
}

Неявно объявленный деструктор может не иметь определения вообще или по правилам C++11 быть определённым как deleted. Явно определённый с пустым телом деструктор может быть ill-formed:

class B
{
    ~B();
};

struct X : B {}; // OK

struct Y : B
{
    ~Y() {} // ошибка: B::~B() не доступен
};

Иногда деструктор приходится определять в том месте, где для этого есть возможность.

// какая-то отдельная единица трансляции

#include <memory>

struct A; // определён в другой единице трансляции

struct X
{
    X();
    ~X(); // определён в другой единице трансляции
    std::unique_ptr<A> p;
};

struct Y
{
    Y();
    std::unique_ptr<A> p;
};

void f()
{
    X x; // OK

    Y y; // ошибка: деструктор класса Y неявно определяется прямо
         // в этой единице трансляции, данное неявное определение
         // некорректно, т.к. здесь A - incomplete
}

============================================================================================

// другая единица трансляции

#include <memory>

struct A; // определён в другой единице трансляции

struct X
{
    X();
    ~X(); // определён в другой единице трансляции
    std::unique_ptr<A> p;
};

struct Y
{
    Y();
    std::unique_ptr<A> p;
};

struct A {};

X::X() {}
X::~X() {}
Y::Y() {}
Re: Деструктор по умолчанию и пустой деструктор
От: Abyx Россия  
Дата: 24.08.11 16:54
Оценка:
Здравствуйте, Максим Рогожин, Вы писали:

МР>Деструктор по умолчанию и пустой деструктор

МР>это одно и тоже? Или бывают ситуации, когда есть разница?

при отладке в debug-конфигурации на пустой деструктор можно поставить точку останова.
In Zen We Trust
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.