自己实现智能指针
#include <utility>
using namespace std;
template <class T>
class MyUniquePtr {
public:
// 默认构造函数
explicit MyUniquePtr(T* p = nullptr) noexcept { myptr_ = nullptr; }
// 移动构造
explicit MyUniquePtr(MyUniquePtr&& p) noexcept;
// 移动赋值
MyUniquePtr& operator=(MyUniquePtr&& p) noexcept;
// 禁止拷贝构造
MyUniquePtr(const MyUniquePtr& p) = delete;
// 禁止赋值构造
MyUniquePtr& operator=(const MyUniquePtr& p) = delete;
// 析构函数
~MyUniquePtr() {
if (myptr_) {
delete myptr_;
}
}
// operator ->
T& operator->() noexcept { return *myptr_; }
// operator *
T* operator*() noexcept { return myptr_; }
// get
T* get() { return myptr_; }
// resert
void realse(T* p = nullptr) {
if (myptr_) {
delete myptr_;
}
myptr_ = p;
}
// swap
void swap(MyUniquePtr& p) { swap(myptr_, p.myptr_); }
// realse
T* realse() {
T* res = myptr_;
myptr_ = nullptr;
return m = res;
}
private:
T* myptr_;
};
template <class T>
MyUniquePtr<T>::MyUniquePtr(MyUniquePtr&& p) noexcept {
this->myptr_ = p.myptr_;
p.myptr_ = nullptr;
}
template <class T>
MyUniquePtr<T>& MyUniquePtr<T>::operator=(MyUniquePtr&& p) noexcept {
swap(*this, p);
}
/*
被noexpect修饰的函数抛出异常,编译器会直接选择调用
标准库的dts::terminate()直接终止程序,比throw()高效
可以有效的防止异常的扩散传播
*/