Почему вызов деструктора для одного экземпляра класса-оболочки приводит к немедленному удалению статического объекта внуC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему вызов деструктора для одного экземпляра класса-оболочки приводит к немедленному удалению статического объекта вну

Сообщение Anonymous »

Я использую класс-оболочку VClock, который сочетает в себе функцию интерфейса для аппаратной реализации (например, Clock_WIN32) и действует как хранитель статического экземпляра этой реализации. >
В моем приложении есть разные объекты, хранящие интеллектуальный указатель на этот класс-оболочку, чтобы использовать его в качестве интерфейса для вызова оборудования. Вызов распространяется из класса интерфейса в экземпляр статической реализации VClock::lock.
Теперь мой проект был выполнен в предположении, что статический объект VClock::lock< /code> не будет удален до конца жизни моего приложения, как и любой статический объект. Я использовал unique_ptr для его представления, поскольку право собственности является неизменным.
Что я наблюдаю, так это то, что во время завершения приложения первый раз уничтожается std::unique_ptr вызывает деструктор VClock, как и должно, но он также очищает статический VClock::lock. В результате, поскольку другие элементы все еще вызывают свои собственные указатели интерфейса времени во время завершения программы, я получаю нарушение памяти, поскольку статический VClock::lock уже исчез. Почему? Почему завершение любого экземпляра VClock также завершает статический объект? Не стоит ли подождать до конца?
Заголовок:

Код: Выделить всё

class VClock
{
private:
static std::mutex              lock;
static std::unique_ptr clock;

protected:
virtual uint64_t GetHardwareTime() = 0;

public:
VClock()                  = default;
VClock(VClock&& src)      = delete;
VClock(const VClock& src) = delete;

virtual ~VClock() {};

static uint64_t GetTimeNow();
};
Источник:

Код: Выделить всё

#include "Hardware/Clock/VClock.hpp"

#ifdef _WIN32
#include "Hardware/Clock/Clock_WIN32.hpp"
#else
#error
#endif

#ifdef _WIN32
std::unique_ptr VClock::clock = std::make_unique();
#else
#error
#endif

std::mutex VClock::lock = std::mutex();

uint64_t VClock::GetTimeNow()
{
std::scoped_lock _{VClock::lock};

return VClock::clock->GetHardwareTime();
}
Я не ожидал, что статический объект также будет удален. Думаю, я мог бы выгрузить статический экземпляр в его собственный статический класс, чтобы решить эту проблему. Однако мне интересно, существует ли более умное дизайнерское решение, позволяющее избежать этого.
Дополнительная деталь:
Внешне объект будет сохранять указатель на интерфейс VClock определяется следующим образом:

Код: Выделить всё

std::unique_ptr clock = std::make_unique()
Таким образом, вызываются деструкторы как класса-оболочки, так и класса реализации.

Подробнее здесь: https://stackoverflow.com/questions/787 ... causes-the
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»