2013-05-27 4 views
1

What is The Rule of Three? упоминаетC++ потребность в функции деструктора

После выполнения тела деструктора и уничтожить любые автоматические объекты , выделенные в организме, деструктор для класса X вызывает деструкторы прямой [ Х ... ] members [n3126.pdf 12.4 §6]

Что оставляет меня в недоумении, что же использовать деструктор, если не для уничтожения членов? Приведите примеры

+0

Где это говорится * Использование деструктора не должно уничтожать членов * ?? –

+0

Я думаю, что Q & A, с которым вы связаны, содержит примеры –

+0

@AlokSave: в цитате говорится, что члены уничтожаются после выполнения (тела) деструктора. Я думаю, что это разумный вывод из этого, что цель (тела) деструктора не * уничтожить членов. Это также верно. –

ответ

3

Это дополнительная очистка, за которую сами участники не несут ответственности. Или в случае управления ресурсами, чтобы убедиться, что ресурсы, связанные с ним, будут правильно выпущены. Помните, что не все участники имеют деструкторы, которые будут называться (указатели не имеют деструкторов). Поэтому, если у вас есть указатели, вам необходимо вручную их управлять.

Пример управления ресурсами с помощью указателей.

shared_ptr::~shared_ptr() 
{ 
    if (decrementReferenceCountAndCheckForZero()) 
    { 
     cleanupResources(); 
    } 
} 

Пример. Работа с каркасами. Ни один из членов не знает о структуре, но рабочий делает.

MyWorker::MyWorker() 
{ 
    Framwork::Register(this); 
} 
MyWorker::~MyWorker() 
{ 
    Framework::Unrigester(this); 
} 
+0

Хотя в случае структуры для разделения обязанностей вы можете разумно захотеть класс« FrameworkRegistration », который обрабатывает регистрацию (un), а затем' В MyWorker есть один элемент данных. В принципе, «Framework :: Unregister» - это не очень удобный для C++ интерфейс, но он легко обернут интерфейсом, совместимым с C++. –

+0

@SteveJessop: Полностью согласен. Просто размахивая потенциальными примерами. –

-1

Деструктор - это метод, который автоматически вызывается, когда объект уничтожается. Wikipedia

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

+0

Я знаю, когда это называется. Я спрашиваю, какой код вы вводите в деструктор? – prongs

+0

Я не понимаю. Вы можете вкладывать в него все, что хотите, например, в конструкторах. –

+0

Фактически, «что есть« что угодно », это то, что я хотел знать – prongs

2

Любое событие, связанное с экземпляром класса, которому требуется диссоциация/освобождение/специальная обработка после прекращения существования объекта.
Несколько примеров:

  • Файл ручки открытые, принадлежащие и используемые экземпляром, а также не будет использоваться уничтожение после объекта.
  • Socktes, mutex и т. Д. Открыты и принадлежат экземпляру класса.
1

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

Foo::~Foo() 
{ 
    Bar b; 
    b.do_whatever(); 
} 

затем деструктор b объекта выполняется до разрушителей любого из членов Foo «s. Тело деструктора выполнено, и автоматический объект, выделенный внутри тела, то есть b, разрушается первым.

0

Это может помочь вам

Предположим, что класс, имеющий массив SomeClass, который динамически создается. В конструкторе предположим, что вы создали

someClass * p = new someClass [10] ; 

тогда в деструкторе можно было бы написать

delete []p ; 
1

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

Например, если вы выделяете объекты new, они должны быть освобождены с помощью delete. Если вы откроете файл с fopen, он будет закрыт с fclose. Если вы возьмете мьютекс Posix с pthread_mutex_lock, он должен быть выпущен с pthread_mutex_unlock.

Для каждого вида ресурсов, необходимых для освобождения вас (или кого-то еще), можно написать класс, который управляет и освобождает этот ресурс, и обеспечивает доступ к его основным операциям. Следовательно, существование таких классов, как std::unique_ptr, std::shared_ptr, std::lock_guard, std::fstream. Конечно, для простоты вам обычно нужен только один класс, который управляет определенным видом ресурсов.Итак, поскольку std::lock_guard существует в C++ 11, единственная причина, по которой вы должны написать собственный класс для выпуска мьютекса, будет, если вы предоставляете альтернативный интерфейс для стандартного. Классы с нестандартными деструкторами в идеале должны быть редкими в вашем собственном коде - часто уже существуют классы, которые можно использовать в качестве элементов данных или автоматических переменных, а деструкторы которых выполняют эту работу.

Смежные вопросы