智能指针
一、智能指针原理
封装普通指针,自动释放,防止堆内存泄漏。
二、常用智能指针
(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会被释放两次。

浙公网安备 33010602011771号