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

Я считаю, что то, что подразумевается под неопределенным поведением в

Каскадные разрушения объектов со статической длительностью хранения

Другие вопросы по тегам