智能指针简单实现
template <typename T> class SmartPointer { public: //构造函数 explicit SmartPointer(T* p=0): _ptr(p), _reference_count(new size_t){ if(p) *_reference_count = 1; else *_reference_count = 0; } //拷贝构造函数 SmartPointer(const SmartPointer& src) { if(this!=&src) { _ptr = src._ptr; _reference_count = src._reference_count; (*_reference_count)++; } } //重载赋值操作符 SmartPointer& operator=(const SmartPointer& src) { if(_ptr==src._ptr) { return *this; } releaseCount(); _ptr = src._ptr; _reference_count = src._reference_count; (*_reference_count)++; return *this; } //重载操作符 T& operator*() { if(ptr) { return *_ptr; } //throw exception } //重载操作符 T* operator->() { if(ptr) { return _ptr; } //throw exception } //析构函数 ~SmartPointer() { if (--(*_reference_count) == 0) { delete _ptr; delete _reference_count; } } private: T *_ptr; size_t *_reference_count; void releaseCount() { if(_ptr) { (*_reference_count)--; if((*_reference_count)==0) { delete _ptr; delete _reference_count; } } } }; int main() { SmartPointer<char> cp1(new char('a')); SmartPointer<char> cp2(cp1); SmartPointer<char> cp3; cp3 = cp2; cp3 = cp1; cp3 = cp3; SmartPointer<char> cp4(new char('b')); cp3 = cp4; }
注意:
构造函数、拷贝构造函数、赋值构造函数不同。
构造函数时,会创建新的ref_count
拷贝构造函数时,会获取拷贝对象的ref_count,然后+1
赋值构造函数时,会先将自身的ref_count-1,调用一下release,然后再获取拷贝对象的ref_count,+1
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2019-03-14 docker 端口映射 及外部无法访问问题
2018-03-14 Linux下设置和查看环境变量(转)