C++ 智能指针

2020-11-11  本文已影响0人  lieon

智能指针

智能指针简单实现

template<class T>
class SmartPointer {
    T *m_pointer;
public:
    SmartPointer(T *pointer): m_pointer(pointer) {}
    
    ~SmartPointer() {
        if (m_pointer == nullptr) {
            return;
        }
        delete m_pointer;
    }
    
    T* operator->() {
        return m_pointer;
    }
};

class Person {
public:
    int m_age;
};

void testSmartPointer() {
    SmartPointer<Person> p(new Person());
    p->m_age = 0;
}

shared_ptr

void testSharedPtr() {
    cout << "1" << endl;
    {
        shared_ptr<Person> p2;
        {
            shared_ptr<Person> p1(new Person());
            p2 = p1;
            cout << "2"  << " use_count: " << p1.use_count() << " " << p2.use_count() << endl; // 2 use_count: 2 2
        }
        cout << "3"  << " use_count: " << p2.use_count() << endl; // 3 use_count: 1
        
    }
    cout << "4" << endl;
}
执行结果:
    1
    Person()
    2 use_count: 2 2
    3 use_count: 1
    ~Person()
    4

shared_ptr的注意点

    Person *p = new Person(); // Person()
    {
        shared_ptr<Person> p1(p); // ~Person()
    }
    {
        shared_ptr<Person> p2(p);
    } // ~Person()  *** error for object 0x100625cc0: pointer being freed was not allocated
    {
        shared_ptr<Person> p1(new Person());
        shared_ptr<Person> p2(p1);
    }
class Car;

class Person {
public:
    shared_ptr<Car> m_car = nullptr;
};


class Car {
public:
    shared_ptr<Person> m_person = nullptr;
};


void testLoopReference() {
    shared_ptr<Person> person(new Person());
    shared_ptr<Car> car(new Car());
    person->m_car = car;
    car->m_person = person;
}

循环引用

weak_ptr

 
 class Car;

 class Person {
 public:
     shared_ptr<Car> m_car = nullptr;
     
     Person() {
         cout << " Person" << endl;
     }
     
     ~Person() {
         cout << " ~Person" << endl;
     }
 };


 class Car {
 public:
     weak_ptr<Person> m_person;// = nullptr;
     Car() {
         cout << " Car" << endl;
     }
     ~Car() {
         cout << " ~Car" << endl;
     }
 };


 void testLoopReference() {
     shared_ptr<Person> person(new Person());
     shared_ptr<Car> car(new Car());
     person->m_car = car;
     car->m_person = person;
     cout << " person: " << person.use_count() << endl;
     cout << " car: " << car.use_count() << endl;
 }
执行结果:
Person
Car
person: 1
car: 2
~Person
~Car
弱引用

unique_ptr

上一篇 下一篇

猜你喜欢

热点阅读