析构函数

结对编程——代码审查

你离开我真会死。 提交于 2019-12-17 08:30:01
软件工程第四次作业   审查队友的代码   代码地址: https://coding.net/u/zzixuk/p/NewCoding/git?public=true 功能模块名称 学生信息管理系统 审查人 朱玉 审查日期 2018.4.5 代码名称 学生信息管理系统 代码作者 赵梓旭 文件结构 重要性 审查项 结论 头文件和定义文件的名称是否合理? 否 头文件和定义文件的目录结构是否合理? 否 版权和版本声明是否完整? 否 重要 头文件是否使用了 ifndef/define/endif 预处理块? 否 头文件中是否只存放“声明”而不存放“定义” 否 程序的版式 重要性 审查项 结论 空行是否得体? 是 代码行内的空格是否得体? 是 长行拆分是否得体? 是 “{” 和 “}” 是否各占一行并且对齐于同一列? 是 重要 一行代码是否只做一件事?如只定义一个变量,只写一条语句。 否 重要 If、for、while、do等语句自占一行,不论执行语句多少都要加 “{}”。 是 重要 在定义变量(或参数)时,是否将修饰符 * 和 & 紧靠变量名?注释是否清晰并且必要? 是 重要 注释是否有错误或者可能导致误解? 否 重要 类结构的public, protected, private顺序是否在所有的程序中保持一致? 否 命名规则 重要性 审查项 结论 重要

new,delete,malloc,free

别说谁变了你拦得住时间么 提交于 2019-12-17 06:02:50
malloc/free是C语言中的内存申请和释放函数,利用它们可方便地管理内存。而在C++中我们又有了新的工具:new/delete。new/delete在管理内存的同时会调用类的构造函数和析构函数,而malloc/free仅仅实现了内存的分配和释放,没有调用类的构造函数和析构函数。 malloc/free是C/C++语言的标准库函数,而new/delete是C++语言的运算符关键字。由于malloc/free是C/C++语言的标准库函数,所以在使用时需要头文件库函数支持。对于非内置数据类型,用malloc/free无法完成动态对象的创建要求,这是因为对象在创建时会自动调用构造函数,释放时会调用析构函数。由于malloc/free不是运行符,不受编译器控制,所以无法完成对象创建和释放时构造函数与析构函数的调用。 void* malloc(long NumBytes);        void free(void* FirstByte); 指针名 = new 类型(参数)        //单个对象内存申请 指针名 = new 类型[个数];        //多个对象内存申请 delete 指针名;             //释放单个对象内存 delete[] 指针名;            //释放多个对象内存 申请了内存空间后,必须检查是否分配成功

delete new malloc free

一曲冷凌霜 提交于 2019-12-17 06:02:31
相同点 :都可用于申请动态内存和释放内存 不同点 : (1) 操作对象有所不同 。 malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加malloc/free。 (2)用法上也有所不同 。 函数malloc 的原型如下: void * malloc(size_t size); 用malloc 申请一块长度为length 的整数类型的内存,程序如下: int *p = (int *) malloc(sizeof(int) * length); 我们应当把注意力集中在两个要素上:“类型转换”和“sizeof”。 1、malloc 返回值的类型是void *,所以在调用malloc 时要显式地进行类型转换,将void * 转换成所需要的指针类型。 2、 malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。 函数free 的原型如下: void free( void * memblock ); 为什么free 函数不象malloc 函数那样复杂呢?这是因为指针p

malloc/free和new/delete

社会主义新天地 提交于 2019-12-17 06:02:20
一. 执行内容: malloc / free: malloc 函数的参数接收所需分配的内存字节数,如果内存满足请求量,将返回指向被分配内存起始地址的指针; free 释放指针所指向的内存,其中指针必须指向所释放内存空间的首地址; new / delete: new 分为两步:1).通过operator new 分配内存 2).为被分配的内存调用一个或多个构造函数构建对象; delete 也分两步: 1).为将被释放的内存调用一个或多个析构函数 2).通过operator delete 释放内存; 二. 本质区别: 1.malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符; 2.对于用户自定义的对象而言,用maloc/free无法满足动态管理对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++需要一个能对对象完成动态内存分配和初始化工作的运算符new,以及一个能对对象完成清理与释放内存工作的运算符delete---简而言之 new/delete能进行对对象进行构造和析构函数的调用进而对内存进行更加详细的工作,而malloc/free不能。 三. 两者联系: 既然new

Delphi自定义类中的“构造函数”与“析构函数”

岁酱吖の 提交于 2019-12-17 03:02:41
1.重载构造函数overload关键字 eg: constructor Create(Name:string;Sex:string;Year:integer;Tall:integer;Weight:integer);overload; constructor Create(Name:string;Sex:string);overload; ps: 重载构造函数,注意一定要使用关键字: overload 2.自定义类中是否需要显式定义构造函数: 所有类默认继承自TObject,即使没有声明class(TObject),Create实际是通知编译器为其分配一块堆内存. 在自定义类中, 即使没有显式的定义构造函数,程序 默认调用的是TObject的构造函数 . 3.TObject.Free的真正作用: 实际上 只是为"堆内存块"解锁 ,使得其他程序可以使用该块堆内存,而引用并没有被 重置为nil, 因此,经常Free之后,仍可以正确访问到对象的成员变量( 解锁后,该块内存没有被其他程序使用 ) 4.自定义的类,什么时候需要专门定义析构函数? 自定义的类中,含有类成员.由于Free操作只是 对当前对象的"堆内存块"进行了解锁 ,而类成员指向的另一块 "堆内存块" 并没有被解锁,如果不在析构函数中对其解锁,则会造成内存泄漏. 5.不需要程序员显示调用Free的自定义类?

C++中构造函数与析构函数的调用顺序

懵懂的女人 提交于 2019-12-16 22:10:24
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 构造函数、析构函数与拷贝构造函数介绍 2.1构造函数 构造函数不能有返回值 缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 创建一个对象时,系统自动调用构造函数 2.2析构函数 析构函数没有参数,也没有返回值。不能重载,也就是说,一个类中只可能定义一个析构函数 如果一个类中没有定义析构函数,系统也会自动生成一个默认的析构函数,为空函数,什么都不做 调用条件:1.在函数体内定义的对象,当函数执行结束时,该对象所在类的析构函数会被自动调用;2.用new运算符动态构建的对象,在使用delete运算符释放它时。 2.3拷贝构造函数 拷贝构造函数实际上也是构造函数,具有一般构造函数的所有特性,其名字也与所属类名相同。拷贝构造函数中只有一个参数,这个参数是对某个同类对象的引用。它在三种情况下被调用: 用类的一个已知的对象去初始化该类的另一个对象时; 函数的形参是类的对象,调用函数进行形参和实参的结合时; 函数的返回值是类的对象,函数执行完返回调用者。 3.构造函数与析构函数的调用顺序 对象是由“底层向上”开始构造的,当建立一个对象时,首先调用 基类的构造函数 ,然后 调用下一个派生类的构造函数 ,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止。因为

QT 子窗口关闭时,不执行析构函数

一个人想着一个人 提交于 2019-12-16 13:06:23
子窗体的构造函数中初始化了父窗体的parent,当关闭子窗体时不会调用析构函数, 只有关闭父窗体时,才会调用子窗体的析构函数, 解决办法如下 setAttribute(Qt::WA_DeleteOnClose); 写在子窗体的构造函数就可以了~ 来源: CSDN 作者: qq_40041064 链接: https://blog.csdn.net/qq_40041064/article/details/103559470

malloc/free 和new/delete区别

被刻印的时光 ゝ 提交于 2019-12-14 19:30:10
(1)、malloc和new都是在堆上开辟内存的,它们都可用于申请动态内存和释放内存。malloc开辟内存永远是通过free释放的;而new是单个元素内存,用delete,如果是new[]数组,则用delete[]来释放内存。 另外, malloc不可以重载,new可以重载 (2)、malloc只负责开辟内存,没有初始化功能,需要用户初始化;new不但开辟内存,还可以进行初始化, eg: int* p=new int(10);表示在堆上开辟了一个4字节的内存,初始值是10, int* p=new int[10]();表示在堆上开辟了一个10个整型元素的数组,初始值为0 (3)、malloc与free是C++/C语言的标准库函数,开辟内存需要传入字节数, eg: int *p=( int *)malloc(sizeof(int)*10) ; malloc在申请内存的时候,必须要提供申请的长度,而且返回的指针是void*型,表示分配的堆内存的起始地址,必须要强转成需要的类型。 new/delete是C++的运算符。开辟内存需要指定类型,返回指定类型的地址,因此不需要进行强转。 另外,函数有函数的调用,依赖于库,但是运算符是语言固有的属性,如+-*/,编译器可以进行翻译; (4)、malloc开辟内存失败会返回NULL,不会抛出异常;而new内存开辟失败会抛出bad_alloc类型的异常

C++动态内存:(二)重载new和delete

别等时光非礼了梦想. 提交于 2019-12-13 14:36:57
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、重载的原因 用new创建动态对象时会发生两件事:(1)使用operatoe new()为对象分配内存(经常是调用malloc)(2)调用构造函数来初始化内存。相对应的调用delete运算符会(1)首先调用析构函数(2)调用operator delete()释放内存(经常是调用free)。我们无法控制构造函数和析构函数的调用,是由编译器调用的。但可以改变内存分配函数operator new()和operator delete()。链接:C++中的new/new[],delete/delete[] 使用了new和delete的内存分配系统是为了通用目的而设计的,但是在特殊的情形下并不能满足需要。最常见的改变分配系统的原因常常是出于效率考虑: (1)增加分配和归还的速度。创建和销毁一个特定的类的非常多的对象,以至于这个运算成了速度的瓶颈。 (2)堆碎片。分配不同大小的内存会在堆上产生很多碎片,以至于虽然内存可能还有,但由于都是碎片,找不到足够大的内存块来满足需要。通过为特定的类创建自己的内存分配器,可以确保这种情况不会发生。例如在嵌入式和实时系统里,程序可能必须在有限资源情况下运行很长时间,这样的系统就要求内存花费相同的时间且不允许出现堆内存耗尽或者出现很多碎片。 (3)检测运用上的错误。例如:new所得的内存

[C++系列] 68.多态基础及虚函数、抽象类详解

别说谁变了你拦得住时间么 提交于 2019-12-13 08:59:16
文章目录 1. 多态的概念 1.1 概念 2. 多态的定义及实现 2.1 多态定义的构成条件 2.2 重载、覆盖(重写)、隐藏(重定义)的对比 3. C++11 override 和 final 4. 抽象类 4.2 接口继承和实现继承 1. 多态的概念 1.1 概念 多态的概念:通俗来说,就是多种形态, 具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 举个栗子:比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优 先买票。 再举个栗子: 最近为了 争夺在线支付市场 ,支付宝年底经常会做诱人的扫 红包-支付-给奖励金 的活动。那么大家想想为什么有人扫的红包又大又新鲜8块、10块…,而有人扫的红包都是1毛,5毛…。其实这背后也是一个多态行为。支付宝首先会分析你的账户数据,比如你是新用户、比如你没有经常支付宝支付等等,那么你需要被鼓励使用支付宝,那么就你扫码金额 = random()%99;比如你经常使用支付宝支付或者支付宝账户中常年没钱,那么就不需要太鼓励你去使用支付宝,那么就你扫码金额 = random()%1;总结一下: 同样是扫码动作,不同的用户扫得到的不一样的红包,这也是一种多态行为 。ps:支付宝红包问题纯属瞎编,大家仅供娱乐。 2. 多态的定义及实现 2.1 多态定义的构成条件 多态是在不同继承关系的类对象,去调用同一函数