Cześć,
w ramach pisania biblioteki, która ma być zbiorem różnych pomocnych narzędzi (docelowo piszę to jako API i jako silnik do gier), postanowiłem napisać własny menedżer pamięci. Postanowiłem także podmienić std::allocator w kontenerach STL na swój własny, np.
namespace GLOWE
{
template<class T>
class Vector final : public std::vector<T, GLOWE::template StdAllocator<T>>
{
public:
virtual ~Vector(void) = default;
};
}
Aby swój menedżer pamięci udostępnić metodom i funkcjom wewnątrz API oraz użytkownikowi, stworzyłem prostą klasę template OneInstance (według wzorca Singleton):
namespace GLOWE
{
template<class T>
class OneInstance final
{
private:
static std::unique_ptr<T> data;
public:
OneInstance(void) = delete;
OneInstance(_In_ const OneInstance<T>& arg) = delete;
OneInstance(_In_ OneInstance<T>&& arg) = delete;
~OneInstance(void) = delete;
static T& instance(void);
};
template<class T>
std::unique_ptr<T> OneInstance<T>::data;
template<class T>
T & OneInstance<T>::instance(void)
{
static_assert(std::is_class<T>::value, "OneInstance works only for classes.");
if (!OneInstance<T>::data)
{
OneInstance<T>::data = std::make_unique<T>();
}
return *OneInstance<T>::data;
}
template<class T>
inline T& getInstance(void)
{
return OneInstance<T>::instance();
}
}
Niestety, kolejność destrukcji jest nieznana/niezdefiniowana. Tworzy to problem, gdy podczas wywoływania konstruktorów np. menedżer pamięci został już usunięty, ale taki Vector lub String w innym Singletonie, który jest, niestety, niszczony potem, wymaga istnienia tego menedżera, aby zdealokować swoją pamięć. Powstaje błąd i program się wywala.
Czy mogę jakoś to naprawić? Każda pomoc będzie mile widziana.