和记娱乐


网站导航

联系我们

和记娱乐

联系人: 

电 话:021-64057486

公司网址:http://www.happy123456789.com

   址:成都市松江区漕河泾松江新兴产业园区研展路丰产支路55号B座803室

邮编:201165


通信科技

您的当前位置: 和记娱乐主页 > 通信科技 >

boost提供的智能指针

发布日期:2020-03-07 13:47 来源:和记h88 发布人:和记娱乐 点击:

  智能指针能够使C++的开发简单化,主要是它能够像其它性语言(如C#、VB)自动管理内存的,而且能够做更多的事情。

  我们知道在C++中的对象不再使用是很难定义的,因此C++中的资源管理是很复杂的。各种智能指针能够操作不同的情况。当然,智能指针能够在任务结束的时候删除对象,除了在程序之外。

  许多库都提供了智能指针的操作,但都有自己的优点和缺点。Boost库是一个高质量的开源的C++模板库,很多人都考虑将其加入下一个C++标准库的版本中。

  本指针中有一个引用指针记数器,表示类型T的对象是否已经不再使用。shared_ptr 是Boost中提供普通的智能指针,大多数地方都使用shared_ptr。

  当离开作用域能够自动的指针。因为它是不传递所有权的。事实上它明确任何想要这样做的!这在你需要确保指针任何时候只有一个拥有者时的任何一种情境下都常重要的。

  比 shared_ptr 更好的智能指针,但是需要类型 T 提供自己的指针使用引用记数机制。

  scoped_ptr 是 Boost 提供的一个简单的智能指针,它能够在离开作用域后对象被。

  例子说明:本例子使用了一个帮助我们理解的类: CSample, 在类的构造函数、赋值函数、析构函数中都加入了打印调试语句。因此在程序执行的每一步都会打印调试信息。在例子的目录里已经包含了程序中需要的Boost库的部分内容,不需要下载其它内容(查看Boost的安装指南)。

  使用普通普通指针的时候,我们必须记住在函数退出的时候要在这个函数内创建的对象。当我们使用例外的时候处理指针是特别烦人的事情(容易忘记它)。使用scoped_ptr 指针就能够在函数结束的时候自动它,但对于函数外创建的指针就为力了。

  优点:对于在复杂的函数种,使用scoped_ptr 指针能够帮助我们处理那些容易忘记的对象。也因此在调试模式下如果使用了空指针,就会出现一个断言。

  引用指针计数器记录有多少个引用指针指向同一个对象,如果最后一个引用指针被的时候,那么就对象本身。

  shared_ptr 就是Boost中普通的引用指针计数器,它表示可以有多个指针指向同一个对象,看下面的例子:

  在(A)中在堆栈重创建了CSample类的一个实例,并且分配了一个shared_ptr指针。对象mySample入下图所示:

  我们重置第一个指针(将mySample设置为空),程序中仍然有一个Csample实例,mySample2有一个引用指针。

  只要当最有一个引用指针mySample2退出了它的作用域之外,Csample这个实例才被。

  当然,并不仅限于单个Csample这个实例,或者是两个指针,一个函数,下面是用shared_ptr的实例:

  注意:如果你没有听说过PIMPL (a.k.a. handle/body) 和 RAII,可以找一个好的C++书,在C++中处于重要的内容,一般C++程序员都应该知道(不过我就是第一次看到这个写法)。智能指针只是一中方便的他们的方法,本文中不讨论他们的内容。

  PIMPL:如果必须包容一个可能抛异常的子对象,但仍然不想从你自己的构造函数中抛出异常,考虑使用被叫做Handle Class或Pimpl的方法(“Pimpl”个双关语:pImpl或“pointer to implementation”)

  如果你定义了一个U*能够强制转换到T*(因为T是U的基类),那么shared_ptr也能够强制转换到shared_ptr

  许多容器类,包括STL,都需要拷贝操作(例如,我们插入一个存在的元素到list,vector,或者container。)当拷贝操作常资源的时候(这些操作时必须的),典型的操作就是使用容器指针。

  当vector被的时候,这个元素自动被了。当然,除非有另一个智能指针引用了它,则还本能被。让我们看Sample3中的使用:

  使用智能指针的一些操作会产生错误(突出的事那些不可用的引用计数器,一些对象太容易,或者根本不掉)。Boost增强了这种安全性,处理了所有潜在存在的,所以我们要遵循以下几条规则使我们的代码更加安全。

  规则一:赋值和保存 —— 对于智能指针来说,赋值是立即创建一个实例,并且保存在那里。现在智能指针拥有一个对象,你不能手动它,或者取走它,这将帮助你避免意外地了一个对象,但你还在引用它,或者结束一个不可用的引用计数器。

  ·         重新找回原始指针,使用ptr.get(),不必这个指针,智能指针会去、重置、赋值。使用get()仅仅通过函数指针来获取原始指针。

  规则三:非循环引用 —— 如果有两个对象引用,而他们彼此都通过一个一个引用指针计数器,那么它们不能,Boost 提供了weak_ptr来打破这种循环引用(下面介绍)。

  规则四:非临时的 share_ptr —— 不能够造一个临时的share_ptr来指向它们的函数,应该命名一个局部变量来实现。(这可以使处理以外更安全,Boost share_ptr best practices 有详细解说)。

  引用计数器是一种便利的资源管理机制,它有一个基本回收机制。但循环引用不能够自动回收,计算机很难检测到。一个最简单的例子,如下:

  如果我们调用dad.reset(),那么我们两个对象都会失去联系。但这种正确的离开这个引用,共享的指针看上去没有理由去那两个对象,我们不能够再访问那两个对象,但那两个对象的确还存在,这是一种非常严重的内存泄露。如果拥有更多的这种对象,那么将由更多的临界资源不能正常。

  如果不能解决好共享智能指针的这种操作,这将是一个严重的问题(至少是我们不可接受的)。因此我们需要打破这种循环引用,下面有三种方法:

  B、   当Dad的期超过Child的期的时候,Child需要一个普通指针指向Dad。

  方法A和B并不是一个完美的解决方案,但是可以在不使用weak_ptr的情况下让我们使用智能指针,让我们看看weak_ptr的详细情况。

  一个强引用当被引用的对象活着的话,这个引用也存在(就是说,当至少有一个强引用,那么这个对象就不能被)。boost::share_ptr就是强引用。相对而言,弱引用当引用的对象活着的时候不一定存在。仅仅是当它存在的时候的一个引用。

  shared_ptr比普通指针提供了更完善的功能。有一个小小的代价,那就是一个共享指针比普通指针占用更多的空间,每一个对象都有一个共享指针,这个指针有引用计数器以便于。但对于大多数实际情况,这些都是可以忽略不计的。

  intrusive_ptr 提供了一个折中的解决方案。它提供了一个轻量级的引用计数器,但必须对象本身已经有了一个对象引用计数器。这并不是坏的想法,当你自己的设计的类中实现智能指针相同的工作,那么一定已经定义了一个引用计数器,这样只需要更少的内存,而且可以提高执行性能。

  这是一个最简单的(非线程安全)实现操作。但作为一种通用的操作,如果提供一种基类来完成这种操作或许很有使用价值,也许在其他地方会介绍到。

  scoped_array 和 shared_array和讲的基本上相同,只不过他们是指向数组的。就像使用指针操作一样使用operator new[] ,他们都重载了operator new[]。注意他们并不初始化分配长度。

  Boost的头文件都在boost\子目录里,例如本文档例子中有#include boost/smart_ptr.hpp。所以任何人当读到年的源文件的时候就立刻知道你用到了boost中的智能指针。

  本文档中的例子里有一个子目录boost\仅仅包含了本例子中使用到的一些头文件,仅仅是为了你编译这个例子,如果你需要下载完整的boost或者获取更多的资源请到。

  在Windows的头文件中已经定义了min 和 max宏,所以在STL中的这两个函数就调用不到了,例如在MFC中就是这样,但是在Boost中,都是使用的std::命名空间下的函数,使用Windows的函数不能够接受不同类型的参数在模板中使用,但是许多库都依赖这些。

  虽然Boost尽量处理这些问题,但有时候遇到这样的问题的时候就需要在自己的代码中加入像下面的代码在第一个#include前加入#define _NOMINMAX。

  智能指针能够使C++的开发简单化,主要是它能够像其它性语言(如C#、VB)自动管理内存的,而且能够做更多的事情。

  我们知道在C++中的对象不再使用是很难定义的,因此C++中的资源管理是很复杂的。各种智能指针能够操作不同的情况。当然,智能指针能够在任务结束的时候删除对象,除了在程序之外。

  许多库都提供了智能指针的操作,但都有自己的优点和缺点。Boost库是一个高质量的开源的C++模板库,很多人都考虑将其加入下一个C++标准库的版本中。

  本指针中有一个引用指针记数器,表示类型T的对象是否已经不再使用。shared_ptr 是Boost中提供普通的智能指针,大多数地方都使用shared_ptr。

  当离开作用域能够自动的指针。因为它是不传递所有权的。事实上它明确任何想要这样做的!这在你需要确保指针任何时候只有一个拥有者时的任何一种情境下都常重要的。

  比 shared_ptr 更好的智能指针,但是需要类型 T 提供自己的指针使用引用记数机制。

  scoped_ptr 是 Boost 提供的一个简单的智能指针,它能够在离开作用域后对象被。

  例子说明:本例子使用了一个帮助我们理解的类: CSample, 在类的构造函数、赋值函数、析构函数中都加入了打印调试语句。因此在程序执行的 每一步都会打印调试信息。在例子的目录里已经包含了程序中需要的Boost库的部分内容,不需要下载其它内容(查看Boost的安装指南)。

  使用普通普通指针的时候,我们必须记住在函数退出的时候要在这个函数内创建的对象。当我们使用例外的时候处理指针是特别烦人的事情(容易忘记它)。使用scoped_ptr 指针就能够在函数结束的时候自动它,但对于函数外创建的指针就为力了。

  优点:对于在复杂的函数种,使用scoped_ptr 指针能够帮助我们处理那些容易忘记的对象。也因此在调试模式下如果使用了空指针,就会出现一个断言。

  引用指针计数器记录有多少个引用指针指向同一个对象,如果最后一个引用指针被的时候,那么就对象本身。

  shared_ptr 就是Boost中普通的引用指针计数器,它表示可以有多个指针指向同一个对象,看下面的例子:

  在(A)中在堆栈重创建了CSample类的一个实例,并且分配了一个shared_ptr指针。对象mySample入下图所示:

  我们重置第一个指针(将mySample设置为空),程序中仍然有一个Csample实例,mySample2有一个引用指针。

  只要当最有一个引用指针mySample2退出了它的作用域之外,Csample这个实例才被。

  当然,并不仅限于单个Csample这个实例,或者是两个指针,一个函数,下面是用shared_ptr的实例:

  注意:如果你没有听说过PIMPL (a.k.a. handle/body) 和 RAII,可以找一个好的C++书,在C++中处于重要的内容,一般C++程序员都应该知道(不过我就是第一次看到这个写 法)。智能指针只是一中方便的他们的方法,本文中不讨论他们的内容。

  PIMPL:如果必须包容一个可能抛异常的子对象,但仍然不想从你自己的构造函数中抛出异常,考虑使用被叫做Handle Class或Pimpl的方法(“Pimpl”个双关语:pImpl或“pointer to implementation”)

      和记娱乐,和记h88,h88平台官网