Можно ли это назвать нормальной реализацией std::unique_ptr?
Обновил
template <class T>
class My_unique_ptr
{
private:
T * ptr;
public:
My_unique_ptr(T * s_ptr=nullptr) : ptr(s_ptr)
{
}
~My_unique_ptr()
{
delete ptr;
}
My_unique_ptr(const My_unique_ptr& value) = delete; // запретили конструктор копирования
My_unique_ptr(My_unique_ptr&& s_ptr) : ptr(s_ptr.ptr)
{
s_ptr.ptr = nullptr;
}
My_unique_ptr& operator=(const My_unique_ptr& value) = delete; // запретили копирование
My_unique_ptr& operator=(My_unique_ptr&& s_ptr)
{
if (&s_ptr == this)
return *this;
delete ptr ;
ptr = s_ptr.ptr;
s_ptr.ptr = nullptr;
return *this;
}
operator bool() const { if (ptr) return true; else return false; }
T* operator->() const { return ptr == ; }
T& operator*() const
{
assert(ptr && "is nullptr");
return *ptr;
}
void swap(My_unique_ptr& obj) noexcept
{
T* temp{ std::move(obj.ptr) };
obj.ptr = ptr;
ptr = temp;
}
void reset(T* obj = nullptr) noexcept
{
if (ptr)
delete ptr;
if (obj)
ptr = obj;
}
T * release() noexcept
{
T * old_ptr = ptr;
ptr = nullptr;
return old_ptr;
}
T * get() noexcept
{
return ptr;
}
};
Ответы (1 шт):
Автор решения: user7860670
→ Ссылка
В operator= происходит утечка памяти.
В operator* нет даже ассерта на разыменование нулевого указателя.
Нет варианта работы с указателем, выделенным при помощи new[].
Нет варианта предоставления пользовательской функции освобождения ресурсов.
Нет поддержки noexcept.