文章标题 原创 翻译 转载 文章内容 此实现仅做学习之用,生产中不要使用,可以使用std::shared_ptr和boost::shared_ptr。 代码很少相信大家都看得懂。 ``` template<class T> class SmartPtr { struct Counter { Counter() : count(1){} int count; }; public: SmartPtr(): c_(NULL), p_(NULL) {} explicit SmartPtr(T *p) : c_(new Counter()), p_(p) {} SmartPtr(const SmartPtr &p) : c_(p.c_), p_(p.p_){ inc(); } SmartPtr& operator=(const SmartPtr &p) { if (this != &p) { dec(); c_ = p.c_; p_ = p.p_; inc(); } return *this; } ~SmartPtr() { dec(); } T* operator->() const { return p_; } T& operator*() const { return *p_; } operator bool() const { return !!p_; } bool operator!() const { return !p_; } T* get() const { return p_; } private: void inc() { if (c_) { c_->count++; } } void dec() { if (c_ && --c_->count == 0) { delete p_; delete c_; } } private: Counter *c_; T* p_; }; ``` 测试: ``` class Widget { public: Widget() { std::cout << "Widget\n"; } ~Widget() { std::cout << "~Widget\n"; } void show() { std::cout << "show\n"; } }; int _tmain(int argc, _TCHAR* argv[]) { { SmartPtr<Widget> p4; { SmartPtr<Widget> p(new Widget()); SmartPtr<Widget> p2(new Widget()); SmartPtr<Widget> p3 = p; p3->show(); p2 = p3; p2->show(); p4 = p2; } if (p4) { p4->show(); p4.get()->show(); } } system("pause"); return 0; } ``` 文章类别 Python Mobile Android Java Shell Life Database Bug Windows IOS Tools Boost Node.js Mac Product Tips C/C++ Golang Javascript React Qt MQ MongoDB Design Web Linux LLM ChatGPT RAG AI 提交