首页 > 编程语言 >C++几种智能指针之间的比较

C++几种智能指针之间的比较

时间:2023-05-26 15:34:22浏览次数:37  
标签:一个 auto C++ 几种 scoped 看电视 shared ptr 指针


这些智能指针在设计的时候,一个关键的问题就是所有权的控制。如果把指针所指向的对象比作电视机的话,那么指针就是观众。第一个人需要看电视的时候需要打开它,没人看的时候就要保证把电视关掉。

对于std::auto_ptr,boost::shared_ptr和scoped_ptr,情况如下:
1. std::auto_ptr:auto_ptr这个种族很有趣,每次只让一个人看电视,大家可以换着看,由最后那个不想看的人关掉。当把一个auto_ptr赋值给另一个时,就好比换一个人看电视似的。总之,电视只能一个人看,第二个人想看第一个就得让位。
2. boost::shared_ptr:这个种族就很大方了,有好节目大家一起看:)只要最后一个看电视的人走的时候关掉就好了。看电视的每个人都知道当时有多少人在看,所以最后一个人知道自己的确是最后一个人。
3. boost::scoped_ptr:这是最自私的种族,每个电视只能让一个人看,别人门都没有。所以你不要试图去复制一个scoped_ptr对象。自己的电视自己处理,为了省电自己也得关吧,的确很安全:)
所以,auto_ptr的机理就是复制时转移所有权,也就是所指的对象永远最多为一个auto_ptr对象所有,这样就能保证对象能安全的释放。shared_ptr基于引用计数,当把一个shared_ptr赋给另一个时,引用计数加一,当一个shared_ptr析构时,引用计数减一,当减为零时释放对象。而scoped_ptr不允许复制,所以自始至终对象由唯一的scoped_ptr创建,维护并释放。

标签:一个,auto,C++,几种,scoped,看电视,shared,ptr,指针
From: https://blog.51cto.com/u_16131207/6356817

相关文章

  • C++写得统计线程利用率的小工具
    thread_usage.h#ifndef__THREAD_USAGE__#define__THREAD_USAGE__#include<fstream>#include<string>#include<map>#include<pthread.h>#include<sys/time.h>namespacethread{classCThreadUsage{pu......
  • How to initialize a static const map in c++?
    #include<map>usingnamespacestd;structA{staticmap<int,int>create_map(){map<int,int>m;m[1]=2;m[3]=4;m[5]=6;returnm;}staticconstma......
  • (双指针)剑指 Offer 57. 和为s的两个数字
    题目描述:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。   classSolution{publicint[]twoSum(intnums[],inttarget){inti=0,j=nums.length-1;while(i<j){......
  • C++ 注释
     程序的注释是解释性语句,您可以在C++代码中包含注释,这将提高源代码的可读性。所有的编程语言都允许某种形式的注释。C++支持单行注释和多行注释。注释中的所有字符会被C++编译器忽略。C++注释一般有两种:// -一般用于单行注释。/*...*/ -一般用于多行注释。......
  • C++外卖点餐系统[2023-05-26]
    C++外卖点餐系统[2023-05-26]选题九:外卖点餐系统7.基本要求:[1]编写一个外卖点餐系统,实现对客户、店铺、订单及配送人员等信息的管理。[2]客户信息包括:客户姓名、联系方式、地址等;店铺信息包括:其菜品和价格评分等;配送人员信息包括:姓名,联系方式、评分等:订单信息包括:编......
  • c++ condition_variable wait notify_one
    #include<chrono>#include<condition_variable>#include<ctime>#include<curl/curl.h>#include<curl/easy.h>#include<fstream>#include<future>#include<iostream>#include<iomanip>#include<m......
  • WebGL几种常用服务图层的制作流程
    当前,越来越多的用户开始使用三维GIS平台SuperMapiClent3DforWebGL,对于新用户来说最常见的两个问题就是:1.为什么打开场景看不到数据?2.为何范例能实现的效果,我的数据就不行了?而造成这两个问题绝大多数的原因是数据处理不当,本文将讲解制作WebGL常用服务图层的流程及注意事项。 ......
  • 指针初阶
    一、指针1、什么是指针     指针是一个变量,是用来存放某个数据或元素在内存(存储空间)中的地址的。通过这个指针可以间接的访问指针指向的数据或元素。什么类型的数据就用什么类型的指针,如:int类型的数据,就用【int*指针变量名】去存储。2、指针所指向的空间的大小是多大?   ......
  • C++中extern "C"的使用
    由上一篇博客知识可得,C++中对符号表中符号的生成方式是不一样的,所以我们需要一种兼容方式处理他们上篇博客地址:https://www.cnblogs.com/woodx/p/17434227.html 但是如果我们需要沿用C的代码,需要链接静态库或动态库的时候,是不是会发生冲突呢 因此需要提前声明extern"C" ......
  • c++之数据库插入
    简述大数据采用数据切分批量插入数据库的方法内容数据导入功能,数据量为360W,按照我们通常的比较笨的方法则的遍历数据一条条的往数据库插入;经实验证明这个方法确实可以完成这个工作,但是它的插入数据的速度太慢,尤其当随着数据库的数据增加,速度会越来越慢;首先,我们知道一条条插入数据是......