66 CPP智能指针-unique_ptr

本文详细介绍了C++中智能指针unique_ptr的基本用法、技巧及其应用场景。包括如何初始化、使用方法、函数参数应用等内容,并探讨了其设计原理及注意事项。

66 CPP智能指针

普通指针的不足:

1 new和new[]的内存需要用delete和delete[]释放。

2 程序员的主观失误,忘了或者漏了释放。

3 程序员也不确定何时释放。(例如过个线程共享一个对象的时候)

为了避免内存泄漏的问题,就想出了一些办法,

如果是类里面的指针,我们会把释放资源的代码卸载析构函数中,对象过期的时候,系统自动调用析构函数,释放资源。

如果堆区的内存时C++内置的数据类型,没析构函数,就只能手动释放了。

另外类虽然有析构函数,可以释放资源,但是,如果类的对象时new出来的,必须delete才会调用析构函数。如果忘了delete,怎么办呢?所以就想出了智能指针。

智能指针的目的就是解决资源释放的问题。

智能指针的设计思路:

智能指针是类模板,在栈上创建智能指针对象。

然后把普通指针交给智能指针对象。

智能指针对象过期的时候,系统会自动调用析构函数释放普通指针的内存。

智能指针的类型:

auto_ptr是C++98的标准,C++17已弃用。

unique_ptr、shared_ptr和weak_ptr是C++标准的。

一、智能指针 unique_ptr

unique_ptr独享它指向的对象,也就是说,同时只有一个unique_ptr指向同一个对象,当这个unique_ptr被销毁时,指向的对象也随即被销毁。

一、基本用法

1)初始化

方法一:

unique_ptr p0(new AA("西施")); // 分配内存并初始化。

方法二:

unique_ptr p0 = make_unique("西施"); // C++14标准。

unique_ptr pp1=make_unique(); // 数据类型为int。

unique_ptr pp2 = make_unique(); // 数据类型为AA,默认构造函数。

unique_ptr pp3 = make_unique("西施"); // 数据类型为AA,一个参数的构造函数。

unique_ptr pp4 = make_unique("西施",8); // 数据类型为AA,两个参数的构造函数。

方法三(不推荐):

AA* p = new AA("西施");

unique_ptr p0(p); // 用已存在的地址初始化。

2)使用方法

智能指针重载了和->操作符,可以像使用指针一样使用unique_ptr。

不支持普通的拷贝和赋值。AA p = new AA("西施");

unique_ptr pu2 = p; // 错误,不能把普通指针直接赋给智能指针。

unique_ptr pu3 = new AA("西施"); // 错误,不能把普通指针直接赋给智能指针。

unique_ptr pu2 = pu1; // 错误,不能用其它unique_ptr拷贝构造。

unique_ptr pu3;

pu3 = pu1; // 错误,不能用=对unique_ptr进行赋值。

不要用同一个裸指针初始化多个unique_ptr对象。

get()方法返回裸指针。

不要用unique_ptr管理不是new分配的内存。

3)用于函数的参数

传引用(不能传值,因为unique_ptr没有拷贝构造函数)。

裸指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值