C++——Big Three(copy ctor、copy op=、dtor)
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)的更多相关文章
- C++ 拷贝构造函数 copy ctor & 拷贝赋值函数 copy op=
类中含有 指针类型 的成员变量时,就必须要定义 copy ctor 和 copy op= copy ctor 请见: class Rectangle { public: Rectangle(Rec ...
- Python基础—set、copy(Day7)
一.数据类型补充 1.str:.isspace()字符串是空格或至少是一个空格. s='alex' s1=' ' ret=s1.isspace() print(ret)执行结果:True 2.tul ...
- 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 ...
- iOS之NSArray类簇简介-(copy、mutableCopy导致程序crash)
1.前言 开发时常常用数组对数据进行处理,对NSMutableArray进行操作时经常导致程序崩溃,特研究一下NSArray的类簇!涉及__NSPlaceholderArray.__NSArray0. ...
- C++异常安全、copy and swap
异常安全的代码是指,满足两个条件 1异常中立性 : 是指当你的代码(包括你调用的代码)引发异常时,这个异常 能保持原样传递到外层调用代码.(异常中立,就是指任何底层的异常都会抛出到上层,也就相当于是异 ...
- 【iOS atomic、nonatomic、assign、copy、retain、weak、strong】的定义和区别详解
一.atomic与nonatomic 1.相同点 都是为对象添加get和set方法 2.不同点 atomic为get方法加了一把安全锁(及原子锁),使得方法get线程安全,执行效率慢 nonatomi ...
- iOS中assign、copy 、retain等关键字的含义
iOS中assign.copy .retain等关键字的含义 转自:http://my.oschina.net/majiage/blog/267409 assign: 简单赋值,不更改索引计数cop ...
- Objective-C中的Strong、Copy与MutableCopy
面试过程中经常被问到ARC中Strong.Copy的区别是什么.普通的回答是:一样.文艺(正确)的回答是:分情况(我擦!WQY#$&Y**%OWEUR) 可以先参考这篇文章http://www ...
- OC:内存管理、dealloc方法、copy知识点
属性的声明:使⽤@property声明属性 例如:@property NSString *name: 相当于@interface中声明了两个⽅法(setter.getter): 属性的实现:使⽤@s ...
随机推荐
- 【Leetcode_easy】896. Monotonic Array
problem 896. Monotonic Array solution1: class Solution { public: bool isMonotonic(vector<int>& ...
- Linux配置Docker镜像加速器
Docker默认镜像为官方镜像,可以配置成国内加速器提高速度 登录阿里云控制台,搜索容器镜像服务获取到镜像加速服务地址 新建配置文件 /etc/docker/daemon.json 输入以下内容 { ...
- Python3 IO编程之文件读写
读写文件是最常见的IO操作.python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一个,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序终结操作磁盘, ...
- Cas(08)——单点登出
单点登出 目录 1.1 Cas Client端配置单点登出 1.2 Cas Server端禁用单点登出 1.1 Cas Client端配置单点登出 单点登出功能跟单点登录功能是 ...
- consul分布式集群搭建&简单功能测试&故障恢复【h】
环境准备五台机器: 操作系统 IP Ubuntu 16.04.3 LTS x86_64 192.168.1.185 Ubuntu 16.10 x86_64 192.168.3.152 Ubuntu 1 ...
- 机器学习之径向基神经网络(RBF NN)
本文基于台大机器学习技法系列课程进行的笔记总结. 主要内容如下图所示: 首先介绍一下径向基函数网络的Hypothesis和网络的结构,然后介绍径向基神经网络学习算法,以及利用K-means进行的学习, ...
- python字符串/列表/元组/字典之间的相互转换(5)
一.字符串str与列表list 1.字符串转列表 字符串转为列表list,可以使用str.split()方法,split方法是在字符串中对指定字符进行切片,并返回一个列表,示例代码如下: # !usr ...
- java8中常用的新功能
Lambda表达式的用法,并行流.Optional.循环.线程池等
- [Asp.Net Core] - 使用 ViewComponents 实现分页控件
分页控件(定义分页参数) ~/ViewComponents/PaginationViewComponent.cs using HelloWorld.DataContext; using Microso ...
- Mybatis笔记2
使用Mybatis完成的CRUD操作 个人总结的一些小规律 学习过程中碰到的错误: org.apache.ibatis.exceptions.PersistenceException: ### Err ...