1. C98里的智能指针

std::auto_ptr ,本质上是一个普通的指针,通过地址来访问你一个动态分配的对象,初始化时需要传递一个由new操作符返回的对象地址。

std::auto_ptr的析构函数会调用delete操作符,释放掉其包含的对象内存。

智能指针的原理基于一个常见的习语:RAII(资源申请即初始化)。智能指针确保在任何情况下,动态分配的内存都能够得到正确释放,包括程序因为

异常而中断,原本用于释放内存的代码被跳过的场景。用一个动态分配的对象的地址来初始化智能指针,因为析构函数总是会被执行的,则包含的内存就会被释放。

2. 作用域指针

一个作用域指针独占一个动态分配的对象。其类名为:boost::scoped_ptr,一个作用域指针不能传递它所包含的对象的所有权到另一个作用域指针。作用域指针只是简单保存和独占一个内存地址,在不需要所有权传递的时候应该优先使用boost::scoped_ptr。

由于boost::scoped_ptr的析构函数中使用delete操作符来释放所包含的对象,因此boost::scoped_ptr不能用动态分配的数组来做初始化。

3. 作用域数组

与作用域指针相似。不同在于:作用域数组的析构函数使用delete[]操作符来释放所包含的对象,因此该操作符只能用于数组对象,所以作用域数组必须通过动态分配的数组来初始化。

4. 共享指针

boost c++库中,命名为:boost::shared_ptr,定义在boost/shared_ptr.hpp里。共享指针不一定要独占一个对象,可以和其他boost::shared_ptr类型的智能指针共享所有权。在这种情况下,当引用对象的最后一个智能指针销毁后,对象才会被释放。

由于所有权可以在boost::shared_ptr之间共享,任何一个共享指针都可以被复制,则可以在标准容器中存储智能指针;但不能在标准容器中存储std::auto_ptr,因为在拷贝时传递了所有权,离开作用域时,对象会被销毁。

#include <boost/shared_array.hpp>
#include <iostream> int main() {
boost::shared_array<int> i1(new int[]);
boost::shared_array<int> i2(i1);
i1[] = ;
std::cout << i2[] << std::endl; //输出1
return ;
}

5. 弱指针

弱指针只有在配合共享指针一起使用时才有意义,boost::weak_ptr定义在boost/weak_ptr.hpp里。

boost::weak_ptr必定总是通过boost::shared_ptr来初始化的,一旦初始化后,它基本上只提供一个有用的方法:lock()。该方法返回的

boost::shared_ptr与用来初始化弱指针的共享指针共享所有权。如果这个共享指针不含有任何对象,返回的共享指针也是空的。

boost::shared_ptr<int> sh(new int());
boost::weak_ptr<int> w(sh);

6.指针容器

#include <boost/ptr_container/ptr_vector.hpp>

int main() {
boost::ptr_vector<int> v;
v.push_back(new int());
v.push_back(new int());
}

boost::ptr_vector专门用于动态分配的对象,使用起来更加高效。boost::ptr_vector独占所包含的对象,因而容器之外的共享指针不能共享所有权,和

std::vector<boost::shared_ptr<int> >相反。

boost库:智能指针的更多相关文章

  1. 详解 boost 库智能指针(scoped_ptr<T> 、shared_ptr<T> 、weak_ptr<T> 源码分析)

    一.boost 智能指针 智能指针是利用RAII(Resource Acquisition Is Initialization:资源获取即初始化)来管理资源.关于RAII的讨论可以参考前面的文章.在使 ...

  2. c/c++ 标准库 智能指针( smart pointer ) 是啥玩意儿

    标准库 智能指针( smart pointer ) 是啥玩意儿 一,为什么有智能指针??? c++程序员需要自己善后自己动态开辟的内存,一旦忘了释放,内存就泄露. 智能指针可以帮助程序员"自 ...

  3. boost之智能指针

    内存问题永远是c++中讨论的重要话题 1.c98 auto_ptr的实现,auto_ptr的特点是始终只保持一个指针指向对象,若经过赋值或者拷贝之后原指针失效 #include <iostrea ...

  4. C++ 标准库智能指针

    整理一下c++中shared_ptr,weak_ptr,unique_ptr三种指针的使用案例和注意事项,让程序资源更加案例,在标准库中,需要包含<memory>,在boost库中, 一. ...

  5. 【原/转】【boost】智能指针使用规则以及介绍

    智能指针机制跟Objective-C里面的retainCount引用计数有着相同的原理,当某个对象的引用计数为0是执行delete操作,类似于autorelease 初学者在使用智能指针时,很多情况下 ...

  6. 基于C/S架构的3D对战网络游戏C++框架 _05搭建系统开发环境与Boost智能指针、内存池初步了解

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  7. C++ 智能指针 boost::scoped_ptr分析

    1.scoped_ptr的实现原理及特性 特性:scoped_ptr和auto_ptr类似,但最大的区别就是不能转让管理权限,也就是说scoped_ptr禁止用户进行拷贝和赋值 实现原理:如何才能禁止 ...

  8. C++智能指针详解

    本文出自http://mxdxm.iteye.com/ 一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最 ...

  9. 【转】C++ 智能指针详解

    一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 ...

  10. c++ 中的8种智能指针[转]

    一.简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete.程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 ...

随机推荐

  1. xampp 配置HTTPS

    参考:  https://blog.csdn.net/qq_35128576/article/details/81326524

  2. SQL Server 创建表

    SQL Server 创建表 我们在上一节中完成了数据库的创建,在本节,我们要往这个新的数据库中加入点数据,要想将数据添加到数据库,我们就必须在数据库中添加一个表,接下来来看看具体的操作. 我们的数据 ...

  3. jmeter函数 助手

    Jmeter(一)——函数助手 __char:把一组数字转化成Unicode __counter:计数器,支持多线程(可以理解为多用户) 线程组设置为2个用户,循环两次${__counter(true ...

  4. ConcurrentHashMap1.7源码分析

    参考:https://www.cnblogs.com/liuyun1995/p/8631264.html HashMap不是线程安全的,其所有的方法都未同步,虽然可以使用Collections的syn ...

  5. h5视频做背景的样式

    video{ position: fixed; display: block; width: 100%; object-fit:fill; height:100%; right: 0px; botto ...

  6. (转载)虚拟机出现无法连接虚拟设备sata0:0,因为主机上没有相应设备

    虚拟主机需要镜像文件, 如果是拷贝的虚拟机,还需要桥接联网的话,更改mac地址,

  7. JSP 获取访问者真正的IP地址

    request.getRemoteAddr(),这种方法在大部分情况下都是有效的,但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了, 如果使用了反向代理软件,用re ...

  8. mysql隔离级别相关

    1.原子性.隔离性.一致性.持久性 2.mysql并发控制可能出现的问题: 脏读(A事务读取到B事务未commit的数据后,B事务回滚) 不可重复读(A事务第一次读到的数据,被B事务更新数据后,第二次 ...

  9. 记.net3.5离线安装问题

    dism.exe /online /enable-feature /featurename:netfx3 /Source: X:\sourse\sxs pause 相关文件要相同版本的ISO中提取,否 ...

  10. How to show out three rows from the same databand On A4?

    How to show out three rows from the same databand On A4? Quote Post by DoraHuang » Tue Mar 13, 2018 ...