У вас есть два варианта: использование динамического хранилища или размещение нового.
Первое очевидно (как указано в комментариях, вы можете использовать unique_ptr
). Если вы хотите этого избежать, вы можете попробовать разместить новое с помощью std::aligned_union
в качестве хранилища:
class SomeClass { ... };
class Owner
{
public:
Owner()
{
m_ptr = new(&m_storage) SomeClass();
}
~Owner()
{
m_ptr->~SomeClass();
}
private:
std::aligned_union<0, SomeClass> m_storage;
SomeClass* m_ptr;
};
Примечание: в этом случае вы несете ответственность за вызов деструктора объект, как показано выше.
Вы можете обернуть m_ptr
с помощью unique_ptr
(с удаленным, который вызывает только деструктор), чтобы этого избежать:
struct DtorDeleter
{
template
void operator ()(T* ptr) { ptr->~T(); }
};
std::unique_ptr m_ptr; // no need to call destructor manually