智能指针

一、智能指针原理

封装普通指针,自动释放,防止堆内存泄漏。

二、常用智能指针

(1)shared_ptr

采用计数器方法,允许多个智能指针指向同一个对象,计数为0会自动释放分配资源。

(2)unique_ptr

独享所有权语义。

因为转移一个unique_ptr会把所有权全部从源指针转移给目标指针,源指针置空,所以不支持普通拷贝、赋值,不能用于STL标准容器中。

拷贝一个unique_ptr,拷贝结束,两个unique_ptr指向相同资源,造成结束时对同一内存指针多次释放而导致程序崩溃。

(3)weak_ptr

shared_ptr存在相互引用成环的问题,这样内存无法释放,需要weak_ptr打破环形引用。它只引用,不计数。

(4)auto_ptr

1、分析下面代码,说出问题所在

#include <bits/stdc++.h>

using namespace std;

class A{
public:
    A(){};
    A(int a): age(a) {};
    ~A(){};
private:
    int age;
};

int main()    {
    A *a = new A(10);
    shared_ptr<A> p1(a);
    shared_ptr<A> p2(a);
}

a被复制给shared_ptr两次,在这两个shared_ptr中它们的引用计数都是1,所以在结束时a会被释放两次。

posted @ 2023-04-02 20:37  feifei102  阅读(59)  评论(0)    收藏  举报