500字范文,内容丰富有趣,生活中的好帮手!
500字范文 > 大江东去 浪淘尽 千古风流人物。智能指针

大江东去 浪淘尽 千古风流人物。智能指针

时间:2019-12-12 20:09:59

相关推荐

大江东去 浪淘尽 千古风流人物。智能指针

一、为什么要有智能指针?

通过学习我们知道在C++中,动态内存的管理是用一对运算符完成的:new和delete,new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存。

但在实际应用需要编程人员记住new 并对其 delete 而在实际的代码中很容易忘记会产生内存泄漏和指针异常的问题。

二、智能指针的原理

1、RAII 是一种利用对象生命周期来控制程序资源的简单技术。在对象构建时获取资源,在对象析构时释放资源。

2、重载operator * 和 operator ->, 具有像指针一样的行为。

三、智能指针的使用

1、C++98提供的std::auto_ptr

头文件

#include <memory>

std::auto_ptr 可用来管理单个对象的对内存(管理权转移的思想),但是,请注意如下几点:

(1) 尽量不要使用“operator=”。如果使用了,请不要再使用先前对象。

(2) 记住 release() 函数不会释放对象,仅仅归还所有权。

(3) std::auto_ptr 最好不要当成参数传递(读者可以自行写代码确定为什么不能)。

(4) 由于 std::auto_ptr 的“operator=”问题,有其管理的对象不能放入 std::vector 等容器中。

2、C++11提供的std::unique_ptr

头文件

#include <memory>

unique_ptr 没有release() 函数,不会导致先前的内存泄露问题。其次,由于 unique_ptr 是独享所有权的,所以明确拒绝用户写“

unique_ptr < int>memory2 = unique_ptr < int> my_memory”之类的语句,可以缓解 std::auto_ptr 几个恼人的问题。

由于 unique_ptr 独享所有权,当我们真真需要复制智能指针时,需求便满足不了了。

3、C++11提供的std::shared_ptr

头文件

#include <memory>

是专门用于共享所有权的,由于要共享所有权,其在内部使用了引用计数。

也是用于管理单个堆内存对象的。shared_ptr 也可以很方便的使用。并且没有 release() 函数。关键的一点,shared_ptr 内部维护了一个引用计数,由此可以支持复制、参数传递等。shared_ptr 提供了一个函数 use_count() ,此函数返回shared_ptr 内部的引用计数。当我们需要使用一个共享对象的时候,shared_ptr 是再好不过的了。

4、C++11提供的std::weak_ptr

头文件

#include <memory>

weak_ptr 只对shared_ptr 进行引用,而不改变其引用计数,当被观察的 shared_ptr 失效后,相应的weak_ptr 也相应失效。

weak_ptr 主要用在软件架构设计中,可以在基类(此处的基类并非抽象基类,而是指继承于抽象基类的虚基类)中定义一个 weak_ptr,用于指向子类的shared_ptr,这样基类仅仅观察自己的weak_ptr 是否为空就知道子类有没对自己赋值了,而不用影响子类 shared_ptr 的引用计数,用以降低复杂度,更好的管理对象。

下面附上另外俩篇关于智能指针的博客

/xt_xiaotian/article/details/5714477?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

/flowing_wind/article/details/81301001

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。