1. 程式人生 > >C++智能指針的實現

C++智能指針的實現

cnblogs 智能 new blog tor nbsp urn operator log

轉自 C++11中智能指針的原理、使用、實現



#include <iostream>
#include <memory>
template<typename T>
class SmartPointer {
private:
    T* _ptr;
    size_t* _count;
public:
    SmartPointer(T* ptr = nullptr) :
            _ptr(ptr) {
        if (_ptr) {
            _count = new size_t(1
); } else { _count = new size_t(0); } } SmartPointer(const SmartPointer& ptr) { if (this != &ptr) { this->_ptr = ptr._ptr; this->_count = ptr._count;/** 所以實際上是共用了一個_count,是同一個內存 **/ (*this->_count)++; } } SmartPointer
& operator=(const SmartPointer& ptr) { if (this->_ptr == ptr._ptr) { return *this; } if (this->_ptr) { (*this->_count)--; if (this->_count == 0) { delete this->_ptr; delete this->_count; } }
this->_ptr = ptr._ptr; this->_count = ptr._count; (*this->_count)++; return *this; } T& operator*() { assert(this->_ptr == nullptr); return *(this->_ptr); } T* operator->() { assert(this->_ptr == nullptr); return this->_ptr; } ~SmartPointer() { (*this->_count)--; if (*this->_count == 0) { delete this->_ptr; delete this->_count; } } size_t use_count(){ return *this->_count; } }; int main() { { SmartPointer<int> sp(new int(10)); SmartPointer<int> sp2(sp); SmartPointer<int> sp3(new int(20)); sp2 = sp3; std::cout << sp.use_count() << std::endl; std::cout << sp3.use_count() << std::endl; } //delete operator }

C++智能指針的實現