详细代码放在了: AC/Algorithms/STL/smart pointers/
接口说明
auto_ptr之后在C++11引入了移动语义,所以后面新出的三个智能指针实现和auto_ptr有比较明显区别
auto_ptr
- 是已经在C++11被废弃的指针,其功能对应现在的unique_ptr
- auto_ptr没有满足CopyConstructible和CopyAssignable要求(但是却又提供了复制构造函数和赋值运算符,所以只有在运行时才会报错),这两个要求最终要的就是说你把这个对象复制一份后,原来的对象没有被改变(原来对象如果是右值则可以改变,对应了MoveConstructible)。这和标准库容器所要求的冲突,所以在容器中存放auto_ptr会出现一些无法预料的事情。(比如sort一个vector<auto_ptr>,可能会有复制操作,就会有问题)
- 主要需要实现的一些函数(有省略)
- constructors
- auto_ptr(auto_ptr&) 复制构造函数,注意没有
const auto_ptr&
做参数的版本,因为要修改这个传来的参数 - auto_ptr(X* p) 从指向X类型的一个普通指针构造,用explicit修饰,防止隐式转换
- auto_ptr(auto_ptr&) 复制构造函数,注意没有
- destructor 就是释放资源,
delete get();
- get 获取原始的指针
X* p
- operator* 相当于
*p
- operator-> 相当于
p->
- operator= 赋值运算符,和上面复制构造函数一致
- release 返回原始的指针
X* p
,同时把auto_ptr内的原始指针置为空 - reset 会delete原来的指针,然后用新的指针初始化,默认参数为0
- conversion operators 略
- constructors
unique_ptr
- 主要需要实现的一些函数(有省略)
- constructors
- destructor
- get
- operator bool
- release
- reset
- swap
- operator*
- operator->
- operator[]
shread_ptr
weak_ptr
auto_ptr简单实现
template<typename X>
class m_auto_ptr {
private:
X* _p;
public:
explicit m_auto_ptr(X* p): _p(p) {}
m_auto_ptr(m_auto_ptr& other): _p(other._p) { other._p = nullptr; }
~m_auto_ptr() { delete _p; }
m_auto_ptr<X>& operator=(m_auto_ptr<X>& other) {
if (this != &other) {
// delete _p;
// _p = other._p;
// other._p = nullptr;
reset(other.release());
return *this;
}
}
X& operator*() const { return *_p; }
X* operator->() const { return _p; }
X* get() const { return _p; }
X* release() {
X* p = _p;
_p = nullptr;
return p;
}
void reset(X* p = nullptr) {
if (p != _p) {
delete _p;
_p = p;
}
}
};
网友评论