Big Three

C++ 中Big Three指的是copy ctor 和 copy op=  和  dtor

m_data是个字符串指针。一般而言,处理字符串,都是使用指针,在需要存储字符的时候再创建内存,这是因为字符串的长度有大有小,指针的处理方式有种动态的感觉。使用数组的话,则无法准确设置字符串大小。

默认情况下,如果不写Big Three的话,compiler会帮助我们构造一个。对于copy ctor 、copy op= 其默认行为是逐bit去copy。对于dtor,其默认行为是private data逐bit删除。既然compiler针对Big Three已经提供了一套实现,我们还有必要去写吗?回答这个问题,我们先要弄清楚compiler默认给出的Big Three够不够用。对于Class without pointer member(s),往往compiler默认提供的那套Big Three就够了。但是对于Class with pointer member(s),使用compiler默认提供的那套Big Three往往会导致memory leaks

构造函数:ctor

字符串是什么,从C语言延续下来的概念:有个指针指向一个头,然后后面跟着一串,最后是'\0'结束符号。一个字符串多长,有2种想法

一种是,我不知道多长,但是最后有'\0'结束符号。

另外一种是,最后没有'\0'结束符号,但是有一个表示长度的整数。

拷贝构造函数:copy ctor

接受的是他自己这种东西

拷贝赋值函数:copy op=

接受的是他自己这种东西

compiler默认行为

compiler默认提供的copy ctor,其逐bit拷贝行为如下

默认行为带来两个问题:

①b=a后,b原本指向的memory就发生了内存泄漏。

②b和a指向一块memory,一个改动memory另一个也会跟着受影响。

copy op=的正确步骤一般是是:

①检查self copy

②taiget端原有数据清空

③target端分配和source端相同大小memory

④把source端内存copy到target端

为什么一定要检查self-copy

有两点原因

①浅层原因:都已经存在一份object了,自己拷贝自己还要执行上面copy op=的②~④,效率低下

②本质原因:问题的根本原因并不是效率上的损失那么简单。这可能导致程序行为的不确定性。

如果没有self copy检查,开始copy op=时如下

执行完②,在执行③时,计算source所占memory时行为是不确定的,即neimory具体大小是不确定的。导致后面为target分配内存行为也不确定。最终会导致程序执行情况的不确定。

析构函数:dtor

这段代码展示了ctor和dtor的用法。s1、s2是开辟function stack memory,系统可以自动回收。p开辟的是system heap memory,需要Programmer手动回收。在离开{ }时s1、s2会自动自动调用dtor回收memory。delete p的时候也会调用dtor回收memory。因此整段代码调用3次ctor,3次dtor。

程序执行析构函数的时机有以下4种。

  • 如果在函数中定义了一个对象,当这个函数调用结束时,对象会被释放,且在对象释放前会自动执行析构函数。
  • static局部对象在函数调用结束时对象不释放,所以也不执行析构函数,只有在main 函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。
  • 全局对象则是在程序流程离开其作用域(如main 函数结束或调用exit函数)时,才会执行该全局对象的析构函数。
  • 用new建立的对象,用delete释放该对象时,会调用该对象的析构函数。析构函数的作用不是删除对象,而是在撤销对象占用的内存前完成一些清理工作,使得放些内存可以供新对象使用。析构函数的作用也不限于释放资源方面,它还可以被用来执行用户希望在最后一次使用对象之后所执行的任何操作。

C++——Big Three(copy ctor、copy op=、dtor)的更多相关文章

  1. C++ 拷贝构造函数 copy ctor & 拷贝赋值函数 copy op=

    类中含有  指针类型  的成员变量时,就必须要定义 copy ctor 和 copy op= copy ctor 请见: class Rectangle { public: Rectangle(Rec ...

  2. Python基础—set、copy(Day7)

    一.数据类型补充 1.str:.isspace()字符串是空格或至少是一个空格. s='alex' s1=' ' ret=s1.isspace() print(ret)执行结果:True  2.tul ...

  3. python字典(dictionary)使用:基本函数code实例,字典的合并、排序、copy,函数中*args 和**kwargs做形参和实参

    python字典dictionary几个不常用函数例子 一.字典声明 如,d={}; d= {'x':1,'b':2} d1 = dict(x=1,y=2,z=3)     d2 = dict(a=3 ...

  4. iOS之NSArray类簇简介-(copy、mutableCopy导致程序crash)

    1.前言 开发时常常用数组对数据进行处理,对NSMutableArray进行操作时经常导致程序崩溃,特研究一下NSArray的类簇!涉及__NSPlaceholderArray.__NSArray0. ...

  5. C++异常安全、copy and swap

    异常安全的代码是指,满足两个条件 1异常中立性 : 是指当你的代码(包括你调用的代码)引发异常时,这个异常 能保持原样传递到外层调用代码.(异常中立,就是指任何底层的异常都会抛出到上层,也就相当于是异 ...

  6. 【iOS atomic、nonatomic、assign、copy、retain、weak、strong】的定义和区别详解

    一.atomic与nonatomic 1.相同点 都是为对象添加get和set方法 2.不同点 atomic为get方法加了一把安全锁(及原子锁),使得方法get线程安全,执行效率慢 nonatomi ...

  7. iOS中assign、copy 、retain等关键字的含义

    iOS中assign.copy .retain等关键字的含义  转自:http://my.oschina.net/majiage/blog/267409 assign: 简单赋值,不更改索引计数cop ...

  8. Objective-C中的Strong、Copy与MutableCopy

    面试过程中经常被问到ARC中Strong.Copy的区别是什么.普通的回答是:一样.文艺(正确)的回答是:分情况(我擦!WQY#$&Y**%OWEUR) 可以先参考这篇文章http://www ...

  9. OC:内存管理、dealloc方法、copy知识点

    属性的声明:使⽤@property声明属性
 例如:@property NSString *name: 相当于@interface中声明了两个⽅法(setter.getter): 属性的实现:使⽤@s ...

随机推荐

  1. xray写POC踩坑

    错误记录 静态文件目录不一定是static. 只考虑了linux的情况,如果是 windows 呢,能读取某些应用自己的源码吗. 实际环境参数不一定是id,thinkphp 不适合使用 poc 来写 ...

  2. python的网络工具scapy

    文档 https://scapy.readthedocs.io/en/latest/api/scapy.sendrecv.html 阅读文档 https://blog.csdn.net/Al_xin/ ...

  3. 继400G后,QSFP-DD800G会是下一个风口吗?

    数据中心市场作为光通信企业的主要战场,近三年400G的热度一直都在持续,虽有Facebook F16继续选用100G架构给市场泼了一些冷水等插曲存在,但近日随着阿里巴巴硅光400G QSFP-DD D ...

  4. Tuner工作原理详解

      1.TV自动搜台原理:https://wenku.baidu.com/view/3b771f8b84868762caaed514 2.彩电自动搜台的原理与维修:http://tv.baoxiu.c ...

  5. mysql 连接闪断自动重连的方法(用在后台运行中的PHP代码)

    mysql 连接闪断自动重连的方法(用在后台运行中的PHP代码)当mysql断开连接 $_instance这个还是有值得 所以会报错 MySQL server has gone away 这个地方需要 ...

  6. Linux 线程实现机制分析(转载)

    自从多线程编程的概念出现在 Linux 中以来,Linux 多线应用的发展总是与两个问题脱不开干系:兼容性.效率.本文从线程模型入手,通过分析目前 Linux 平台上最流行的 LinuxThreads ...

  7. jenkins【目录】:目录

    jenkins[目录]:目录 GitLab 自动触发 Jenkins 构建 返回

  8. [转帖]CentOS 7 安装 GlusterFS

    CentOS 7 安装 GlusterFS https://www.cnblogs.com/jicki/p/5801712.html 改天测试一下 我一直没有搞这一块呢.   CentOS 7 Glu ...

  9. P5200 [USACO19JAN]Sleepy Cow Sorting

    P5200 [USACO19JAN]Sleepy Cow Sorting 题目描述 Farmer John正在尝试将他的N头奶牛(1≤N≤10^5),方便起见编号为1…N,在她们前往牧草地吃早餐之前排 ...

  10. ORA-01618 ORA-19809: limit exceeded for recovery files

    由于DB_RECOVERY_FILE_DEST_SIZE 参数设置太小,导致redo只能创建一组,无法创建节点二的日志组,节点二数据库无法启动,如下图: 修改参数后,节点二无法启动到mount模式,无 ...