提交 c174e8ab 编写于 作者: 邹晓航

bug fix

上级 78659a9f
...@@ -6,11 +6,11 @@ ...@@ -6,11 +6,11 @@
namespace TinySTL{ namespace TinySTL{
template<class T> template<class T>
struct default_delete{ struct default_delete{
void operator ()(T* ptr){ delete ptr; } void operator ()(T* ptr){ if(ptr) delete ptr; }
}; };
template<class T> template<class T>
struct default_delete < T[] > { struct default_delete < T[] > {
void operator ()(T* ptr){ delete[] ptr; } void operator ()(T* ptr){ if(ptr) delete[] ptr; }
}; };
template<class T, class D = default_delete<T>> template<class T, class D = default_delete<T>>
...@@ -23,15 +23,15 @@ namespace TinySTL{ ...@@ -23,15 +23,15 @@ namespace TinySTL{
explicit unique_ptr(T *data = nullptr) :data_(data){} explicit unique_ptr(T *data = nullptr) :data_(data){}
unique_ptr(T *data, deleter_type del) :data_(data), deleter(del){} unique_ptr(T *data, deleter_type del) :data_(data), deleter(del){}
unique_ptr(unique_ptr&& up){ unique_ptr(unique_ptr&& up) :data_(nullptr){
clean(); TinySTL::swap(data_, up.data_);
swap(data_, up.data_);
} }
unique_ptr& operator = (unique_ptr&& up){ unique_ptr& operator = (unique_ptr&& up){
if (&up != this){ if (&up != this){
clean(); clean();
swap(*this, up); TinySTL::swap(*this, up);
} }
return *this;
} }
unique_ptr(const unique_ptr&) = delete; unique_ptr(const unique_ptr&) = delete;
...@@ -46,17 +46,15 @@ namespace TinySTL{ ...@@ -46,17 +46,15 @@ namespace TinySTL{
operator bool()const{ return get() != nullptr; } operator bool()const{ return get() != nullptr; }
pointer release(){ pointer release(){
auto p = nullptr; T *p = nullptr;
swap(p, data_); TinySTL::swap(p, data_);
return p; return p;
} }
void reset(pointer p = pointer()){ void reset(pointer p = pointer()){
clean(); clean();
data_ = p; data_ = p;
} }
void swap(unique_ptr& up){ void swap(unique_ptr& up){ TinySTL::swap(data_, up.data_); }
swap(data_, up.data_);
}
element_type operator *()const{ return *data_; } element_type operator *()const{ return *data_; }
pointer operator ->()const{ return data_; } pointer operator ->()const{ return data_; }
...@@ -77,10 +75,26 @@ namespace TinySTL{ ...@@ -77,10 +75,26 @@ namespace TinySTL{
bool operator == (const unique_ptr<T1, D1>& lhs, const unique_ptr<T2, D2>& rhs){ bool operator == (const unique_ptr<T1, D1>& lhs, const unique_ptr<T2, D2>& rhs){
return lhs.get() == rhs.get(); return lhs.get() == rhs.get();
} }
template <class T, class D>
bool operator == (const unique_ptr<T, D>& up, nullptr_t p){
return up.get() == p;
}
template <class T, class D>
bool operator == (nullptr_t p, const unique_ptr<T, D>& up){
return up.get() == p;
}
template <class T1, class D1, class T2, class D2> template <class T1, class D1, class T2, class D2>
bool operator != (const unique_ptr<T1, D1>& lhs, const unique_ptr<T2, D2>& rhs){ bool operator != (const unique_ptr<T1, D1>& lhs, const unique_ptr<T2, D2>& rhs){
return !(lhs == rhs); return !(lhs == rhs);
} }
template <class T, class D>
bool operator != (const unique_ptr<T, D>& up, nullptr_t p){
return up.get() != p;
}
template <class T, class D>
bool operator != (nullptr_t p, const unique_ptr<T, D>& up){
return up.get() != p;
}
template <class T, class... Args> template <class T, class... Args>
unique_ptr<T> make_unique(Args&&... args){ unique_ptr<T> make_unique(Args&&... args){
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册