В моем приложении есть разные объекты, хранящие интеллектуальный указатель на этот класс-оболочку, чтобы использовать его в качестве интерфейса для вызова оборудования. Вызов распространяется из класса интерфейса в экземпляр статической реализации 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