Я думаю, что есть несколько аспектов вопроса.Во-первых, это понимание того, что делает unique_ptr:
Это обернет ваш класс в RAII-стиле, удерживая указатель на ваш класс, и освободит его при разрушении или повторном назначении.Чтобы убедиться, что мы находимся на той же странице, давайте рассмотрим примерную реализацию unique_ptr (взято из this question):
template<typename T>
class unique_ptr {
private:
T* _ptr;
public:
unique_ptr(T& t) {
_ptr = &t;
}
unique_ptr(unique_ptr<T>&& uptr) {
_ptr = std::move(uptr._ptr);
uptr._ptr = nullptr;
}
~unique_ptr() {
delete _ptr;
}
unique_ptr<T>& operator=(unique_ptr<T>&& uptr) {
if (this == uptr) return *this;
_ptr = std::move(uptr._ptr);
uptr._ptr = nullptr;
return *this;
}
unique_ptr(const unique_ptr<T>& uptr) = delete;
unique_ptr<T>& operator=(const unique_ptr<T>& uptr) = delete;
};
Как вы можете видеть, деструктор с уникальным указателем вызывает deleteдля реального объекта в функции ~ unique_ptr ().
Теперь давайте взглянем на стандарт:
3.7.4 Продолжительность динамического хранения [basic.stc.dynamic] 1 Объектыможет создаваться динамически во время выполнения программы (1.9) с использованием выражений new (5.3.4) и уничтожаться с помощью выражений delete (5.3.5).Реализация C ++ обеспечивает доступ к динамическому хранилищу и управление им с помощью оператора глобальных функций выделения new и оператора new [], а также оператора удаления глобальных функций удаления и оператора удаления [].
Также:
Если значение операнда выражения удаления не является значением нулевого указателя, выражение удаления вызовет деструктор (если он есть) для объекта или элементов удаляемого массива.В случае массива элементы будут уничтожены в порядке убывания адреса (то есть в обратном порядке завершения их конструктора; см. 12.6.2).
Теперь, учитывая, что этоповедение, предписанное стандартом, вам нужно объявить и определить деструктор.
Определение, даже если оно пустое, должно указывать компоновщику, куда следует перейти (или что он может просто ничего не делать) в случае, когда объект являетсяудалено.
Итак, в заключение вам нужно либо объявить и определить деструктор самостоятельно, либо использовать автоматически созданный по умолчанию (даже не объявлять его), либо объявить его пометкой по умолчанию.(скажем, компилятор, который вы его определили, но он должен иметь реализацию по умолчанию).