From c174e8abc2c7902fa105ab767ffd0fedc185f9ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=99=93=E8=88=AA?= <1210603696@qq.com> Date: Thu, 12 Mar 2015 16:30:49 +0800 Subject: [PATCH] bug fix --- TinySTL/Memory.h | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/TinySTL/Memory.h b/TinySTL/Memory.h index 2e05e67..bba9941 100644 --- a/TinySTL/Memory.h +++ b/TinySTL/Memory.h @@ -6,11 +6,11 @@ namespace TinySTL{ template struct default_delete{ - void operator ()(T* ptr){ delete ptr; } + void operator ()(T* ptr){ if(ptr) delete ptr; } }; template struct default_delete < T[] > { - void operator ()(T* ptr){ delete[] ptr; } + void operator ()(T* ptr){ if(ptr) delete[] ptr; } }; template> @@ -23,15 +23,15 @@ namespace TinySTL{ explicit unique_ptr(T *data = nullptr) :data_(data){} unique_ptr(T *data, deleter_type del) :data_(data), deleter(del){} - unique_ptr(unique_ptr&& up){ - clean(); - swap(data_, up.data_); + unique_ptr(unique_ptr&& up) :data_(nullptr){ + TinySTL::swap(data_, up.data_); } unique_ptr& operator = (unique_ptr&& up){ if (&up != this){ clean(); - swap(*this, up); + TinySTL::swap(*this, up); } + return *this; } unique_ptr(const unique_ptr&) = delete; @@ -46,17 +46,15 @@ namespace TinySTL{ operator bool()const{ return get() != nullptr; } pointer release(){ - auto p = nullptr; - swap(p, data_); + T *p = nullptr; + TinySTL::swap(p, data_); return p; } void reset(pointer p = pointer()){ clean(); data_ = p; } - void swap(unique_ptr& up){ - swap(data_, up.data_); - } + void swap(unique_ptr& up){ TinySTL::swap(data_, up.data_); } element_type operator *()const{ return *data_; } pointer operator ->()const{ return data_; } @@ -77,10 +75,26 @@ namespace TinySTL{ bool operator == (const unique_ptr& lhs, const unique_ptr& rhs){ return lhs.get() == rhs.get(); } + template + bool operator == (const unique_ptr& up, nullptr_t p){ + return up.get() == p; + } + template + bool operator == (nullptr_t p, const unique_ptr& up){ + return up.get() == p; + } template bool operator != (const unique_ptr& lhs, const unique_ptr& rhs){ return !(lhs == rhs); } + template + bool operator != (const unique_ptr& up, nullptr_t p){ + return up.get() != p; + } + template + bool operator != (nullptr_t p, const unique_ptr& up){ + return up.get() != p; + } template unique_ptr make_unique(Args&&... args){ -- GitLab