C++ Каскадные разрушения объектов со статической продолжительностью хранения
эта ссылка говорит о том, что каскадные разрушения объектов со статической длительностью хранения - популярное неопределенное поведение в C++. Что именно? Я не могу понять Будет лучше, если это объяснить простой программой на C++, которая может продемонстрировать это. Ваша помощь очень ценится. Спасибо
1 ответ
static_destruction.h
#include <vector>
class first
{
public:
static std::vector<int> data;
public:
first();
~first();
};
class second
{
public:
static std::vector<int> data;
public:
second();
~second();
};
class container
{
public:
static first f;
static second s;
};
static_destruction.cpp
#include <iostream>
#include "static_destruction.h"
first::first()
{
data = {1, 2, 3, 4};
}
first::~first()
{
std::cout << second::data.size() << std::endl;
}
std::vector<int> first::data;
second container::s;
int main(void)
{
}
static_destruction2.cpp
#include <iostream>
#include "static_destruction.h"
second::second()
{
data = {1, 2, 3, 4, 5, 6};
}
second::~second()
{
std::cout << first::data.size() << std::endl;
}
std::vector<int> second::data;
first container::f;
Поскольку порядок уничтожения статических объектов в единицах компиляции не определен (фактически это порядок построения, который не определен, но результат тот же, поскольку порядок уничтожения является обратным порядком построения), на моей машине в зависимости от порядка, в котором я компилирую файлы это дает мне разные выводы:
$> g++ -std=c++11 static_destruction.cpp static_destruction2.cpp
$> ./a.out
0
4
а также
$> g++ -std=c++11 static_destruction2.cpp static_destruction.cpp
$> ./a.out
0
6
Я считаю, что то, что подразумевается под неопределенным поведением в
Каскадные разрушения объектов со статической длительностью хранения