auto_ptr原理及仿写
- 不允许隐式构造
- 不能将同一个裸指针赋值给多个智能指针,因为他会重复释放
- 释放空间使用的是delete
- 被废弃的原因,在于auto_ptr允许拷贝构造和拷贝赋值,不过在其中会由指针内存空间所有权的转移,也就是在把一个auto指针赋值给另外一个auto指针之后,原指针失效,这是为了避免两个指针指向同一个内存区域时,两个指针析构重复delete,这是没问题,但是如果使用不细心经常忽略导致指针失效的问题,不过在右值引用加入之后,unique_ptr完全取代了auto_ptr
template<class T>
class My_auto_ptr {
public:
explicit My_auto_ptr(T* ptr = nullptr) : m_ptr(ptr) {
ptr = nullptr;
}
My_auto_ptr(const My_auto_ptr& src) {
m_ptr = src.m_ptr;
src.m_ptr = nullptr;
}
My_auto_ptr& operator=(const My_auto_ptr& src) {
if (src == *this) return *this;
m_ptr = src.m_ptr;
src.m_ptr = nullptr;
return *this;
}
~My_auto_ptr() {
delete m_ptr;
m_ptr = nullptr;
}
T* get() {
return m_ptr;
}
T* release() {
T* ptr = m_ptr;
m_ptr = nullptr;
return ptr;
}
void reset(T* ptr = nullptr) {
delete m_ptr;
m_ptr = ptr;
ptr = nullptr;
}
T& operator*() const {
return *m_ptr;
}
T* operator->() const {
return (&**this);
}
private:
T* m_ptr;
};