一、实现时的一些需要考虑的点
- 对于构造函数,
我们仿照了shared_ptr的源代码,加入了explicit关键字
,防止原始指针隐式的转化为智能指针。 传入空指针或者使用默认构造函数时
,引用计数为0。- 拷贝赋值函数需要
检查自赋值的情况
。 - 释放动态内存时时刻注意两个指针是不是
空指针
。
二、智能指针shared_ptr实现
#include <iostream>
#include <memory>
using namespace std;
template<typename T>
class my_shared_ptr {
private:
size_t* _useCnt;
T* _ptr;
public:
my_shared_ptr() : _ptr(new T), _useCnt(new size_t(0)) {}
explicit my_shared_ptr(T* p) : _ptr(p), _useCnt(new size_t){
if (p) {
*_useCnt = 1;
} else {
*_useCnt = 0;
}
}
my_shared_ptr(const my_shared_ptr& rhs) {
_ptr = rhs._ptr;
_useCnt = rhs._useCnt;
(*_useCnt)++;
}
my_shared_ptr& operator= (const my_shared_ptr& rhs) {
if (this != &rhs) {
if (_ptr) {
--(*_useCnt);
if (*_useCnt == 0) {
delete _useCnt;
delete _ptr;
}
_useCnt = rhs._useCnt;
_ptr = rhs._ptr;
++(*_useCnt);
}
}
return *this;
}
int use_count() {
return *_useCnt;
}
~my_shared_ptr() {
if (!_ptr || (*_useCnt == 1)) {
delete _useCnt;
delete _ptr;
} else {
--(*_useCnt);
}
}
};
int main() {
my_shared_ptr<int> p1(new int(1));
cout << "p1 cnt:" << p1.use_count() << endl;
{
my_shared_ptr<int> p2(p1);
cout << "p2 cnt:" << p2.use_count() << endl;
cout << "p1 cnt:" << p1.use_count() << endl;
}
cout << "p1 cnt:" << p1.use_count() << endl;
my_shared_ptr<int> p4;
cout << "p4 cnt:" << p4.use_count() << endl;
p4 = p1;
cout << "p1 cnt:" << p1.use_count() << " p4 cnt:" << p4.use_count() << endl;
return 0;
}