Порядок уничтожения в C ++ - PullRequest
       8

Порядок уничтожения в C ++

0 голосов
/ 27 февраля 2019
#include <iostream>
class X{
public:
    X(int n = 0) : n(n) {}
    ~X() {std::cout << n;}
    int n;
};
void main()
{
    X a(1);
    const X b(2);
    static X c(3);
}

Вывод равен 213, я думал, что деструктор использует стек LIPO, так почему он не разрушается в обратном порядке 321?

Я довольно запутался, и я 'Я хотел бы узнать больше об этом.Большое вам спасибо.

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Он вызывает деструкторы в обратном порядке, но статическая переменная имеет другое время жизни.

См. Вызывает ли C ++ деструкторы для глобальных и классовых статических переменных? , что объясняет, что переменные с глобальным временем жизни разрушаются через некоторое время после возврата main.

0 голосов
/ 27 февраля 2019

Это LIFO.a и b уничтожаются в обратном порядке, когда возвращается main, c разрушается в некоторой неопределенной точке между моментом, когда возвращается main, и программа фактически завершается (потому что она статическая, привязанная к времени жизни программы, а не main сам).

0 голосов
/ 27 февраля 2019

a и b имеют автоматическую длительность и уничтожаются при завершении блока.c имеет статическую длительность, уничтожается при завершении программы.Порядок LIFO применяется только к объектам, уничтоженным в одной и той же точке программы.

...