Уничтожит ли разрушитель статический член?
Скажем, у меня есть:
class A
{
A()
{}
~A()
{}
};
class B
{
public:
B()
{}
~B()
{}
private:
static A mA;
};
B* pB = new B;
delete pB;
Когда я вызываю delete pB, будет вызван деструктор B. Позже это вызовет деструктор для статического члена A?
Ответы
Ответ 1
Ключевое слово static означает, что переменная не зависит от экземпляров. Вот почему вы можете получить доступ к статическим переменным и методам без создания экземпляра объекта из класса в первую очередь. Поэтому уничтожение экземпляра не повлияет на какие-либо статические переменные.
Ответ 2
Конечно нет. Прежде всего, вы определили явный пустой деструктор. И если деструктор по умолчанию сделал это, вы никогда не смогли бы уничтожить экземпляры, не рискуя сделать класс непригодным.
Ответ 3
С++ Standard 03, 9.4.2 Статические члены данных:
Статический член данных не является частью подобъекты класса. Там есть только одна копия статического элемента данных разделяемых всеми объектами class.class.
Статический член данных не является частью класса - следовательно, он не привязан к классу жизни, ни при построении, ни разрушении.
Конструкция (9.4.2/3)
Как только элемент статических данных был он существует, даже если нет объектов его класса были созданы. Его класс был создан.
Разрушение (9.4.2/7)
Элементы статических данных инициализируются и уничтожаются точно так же, как нелокальные объекты.
Ответ 4
Объекты со статическим временем жизни будут разрушены, когда приложение завершится. Среди различных статических объектов, которые могут быть в программе, деструкторы вызываются в порядке, обратном порядку построения объектов.
Конструкция/уничтожение экземпляров объекта не влияет на создание или уничтожение статического элемента.
Ответ 5
Статические элементы не живут в памяти, назначенной экземпляру класса. Поэтому он не будет удален или деинициализирован, если вы не сделаете это явно в какой-либо части вашего кода (включая деструктор класса, но ваша логика кода должна обрабатывать возможность наличия нескольких экземпляров и т.д.)
Ответ 6
Статические переменные также известны как переменные класса. Это в отличие от переменных экземпляра. Как следует из этих имен, переменные класса относятся ко всему классу, где переменные экземпляра относятся к экземпляру. На основе этих фактов можно определить продолжительность жизни этих переменных.
Другой способ взглянуть на это предполагает, что вызов деструктора фактически уничтожает статические переменные. Представьте, что следствие одного объекта получает экземпляр, а затем удаляется. Что произойдет с статическими переменными, которые будут использоваться всеми другими объектами класса, которые все еще используются.