析构函数

C++中delete和delete[]的区别

江枫思渺然 提交于 2020-02-22 04:38:17
原帖地址 http://www.cnblogs.com/charley_yang/archive/2010/12/08/1899982.html 一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论。做个备份,以免丢失。 C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。 关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。 请看下面的程序。    #include <iostream>; using namespace std; class T { public: T() { cout << "constructor" << endl; } ~T() { cout << "destructor" << endl; } }; int main() { const int NUM = 3; T* p1 = new T[NUM]; cout << hex << p1 << endl; // delete[] p1; delete p1; T* p2 = new T[NUM]; cout << p2 << endl; delete[] p2; }

C++ 内存分配(new,operator new)详解

做~自己de王妃 提交于 2020-02-20 04:12:10
参考: C++ 内存分配(new,operator new)详解 如何限制对象只能建立在堆上或者栈上 new运算符和operator new() new:指我们在C++里通常用到的 运算符 ,比如A* a = new A; 对于new来说,有new和::new之分,前者位于std operator new():指对new的重载形式,它是一个 函数 ,并不是运算符。对于operator new来说, 分为全局重载和类重载 ,全局重载是void* ::operator new(size_t size),在类中重载形式 void* A::operator new(size_t size)。还要注意的是这里的operator new()完成的操作一般只是分配内存,事实上系统 默认的全局 ::operator new(size_t size)也只是调用malloc分配内存,并且返回一个void*指针 。而构造函数的调用(如果需要)是在new运算符中完成的 new和operator new之间的关系 A* a = new A;我们知道这里分为两步: 1.分配内存,2.调用A()构造对象。 事实上,分配内存这一操作就是由operator new(size_t)来完成的,如果类A重载了operator new,那么将调用A::operator new(size_t ),如果没有重载,就调用:

C++笔记(from B站玄马科技)

你。 提交于 2020-02-19 04:32:29
地址: https://space.bilibili.com/477729104 bool类型 C++中的新类型(bool:0为假,非0为真) 占用的字节数(bool:1,BOOL:4) bool类型正确的使用 const常量 const用于修饰变量,将变量变为常量(常量一旦定义,就不可以修改) 编译器在程序的编译时期做的检查 默认参数 函数允许提供默认参 默认参可以写在声明或者定义处,但只能出现在一个地方,一般写在声明处 当一个参数有默认参时,该参数的右边必须都出现默认参 使用宏定义 #define TESTFoo(m,n,k) TestFoo(m,n,k,1,2,3) int TestFoo(int n1, int n2, int n3, int n4, int n5, int n6) { return 0; } 此时,TestFoo内n4, n5, n6的值将会被宏定义中的1,2,3所代替。 也可以采用以下方式 #define TESTFoo(m,n,k) TestFoo(m,n,k,1,2,3) int TestFoo(int n1, int n2, int n3, int n4 = 4, int n5 = 5, int n6 = 6) { return 0; } 此时,n4, n5, n6的值将由函数内部的形参决定,即值为4,5,6 当采用以下方式时 #define

c++复习 多态

偶尔善良 提交于 2020-02-19 00:55:27
虚函数 什么是虚函数? 指向基类的指针在操作它的多态类对象时,会根据不同的类对象调用其相应的函数,这个函数就是虚函数,用virtaul修饰函数名。 虚函数的作用是在程序运行阶段动态地选择合适的成员函数 在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型,(参数顺序也要一致),以实现统一接口, 如果派生类中没有重新定义虚函数,则它集成基类的虚函数 虚函数的重写 虚函数的重写:派生类中有一个跟基类的完全相同虚函数,我们就称子类的虚函数重写了基类的虚函数,完全相同是指:函数名、参数、返回值都相同。另外虚函数的重写也叫作虚函数的覆盖。 class Person { public : virtual void BuyTicket ( ) { cout << "买票-全价" << endl ; } } ; class Student : public Person { public : virtual void BuyTicket ( ) { cout << "买票-半价" << endl ; } } ; void Func ( Person & p ) { p . BuyTicket ( ) ; } int main ( ) { Person ps ; Student st ; Func ( ps ) ; Func ( st ) ; return 0 ; } 不规范的重写行为

C++编译与底层相关知识点复习笔记

你。 提交于 2020-02-18 23:28:13
一、C++源文件从文本到可执行文件经历的过程? 预处理阶段:将 头文件 和 宏定义 进行分析和替换,生成 预编译文件 。 编译阶段:将预编译文件转换成特定 汇编代码 ,生成汇编文件 汇编阶段:将编译阶段生成的汇编文件转化成 机器码 ,生成 可重定位目标文件 链接阶段:将 多个目标文件及所需要的库连接 成最终的可执行目标文件 二、include头文件的顺序? 对于include的头文件来说,如果在文件a.h中声明一个在文件b.h中定义的变量,而不引用b.h。那么要在a.c文件中引用b.h文件,并且要先引用b.h,后引用a.h,否则汇报变量类型未声明错误。 三、双引号和尖括号的区别? 双引号的查找顺序: 1、当前的头文件目录 2、编译器指定的头文件路径 3、系统变量指定的头文件路径 尖括号没有1. 四、C++的虚拟内存 1、代码段,包括只读存储区和文本区。前者存储字符串常量,后者存储机器代码。 2、数据段:存储程序中 已初始化 的 全局变量 和 静态变量 。 3、bss 段:存储未初始化的全局变量和静态变量(局部+全局),以及所有被初始化为0的全局变量和静态变量。 4、堆区:调用new/malloc函数时在堆区动态分配内存,同时需要调用delete/free来手动释放申请的内存。 5、映射区:存储动态链接库以及调用mmap函数进行的文件映射。 6、栈:使用栈空间存储函数的 返回地址

C++中delete和delete[]的区别

点点圈 提交于 2020-02-18 18:09:41
一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论。做个备份,以免丢失。 C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。 关于 new[] 和 delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。 请看下面的程序。 1 #include <iostream>; 2 using namespace std; 3 4 class T { 5 public: 6 T() { cout << "constructor" << endl; } 7 ~T() { cout << "destructor" << endl; } 8 }; 9 10 int main() 11 { 12 const int NUM = 3; 13 14 T* p1 = new T[NUM]; 15 cout << hex << p1 << endl; 16 // delete[] p1; 17 delete p1; 18 19 T* p2 = new T[NUM]; 20 cout << p2 << endl; 21 delete[] p2; 22 } 大家可以自己运行这个程序,看一看 delete p1

GC关键方法解析

萝らか妹 提交于 2020-02-15 15:21:29
第二节.GC关键方法解析   1.Dispose()方法   Dispose可用于释放所有资源,包括托管的和非托管的,需要自己实现。   大多数的非托管资源都要求手动释放,我们应当为释放非托管资源公开一个方法,实现释放非托管资源的方法有很多种,实现IDispose接口的Dispose方法是最好的,这可以给使用你类库的程序员以明确的说明,让他们知道怎样释放你的资源;而且C#中用到的using语句快,也是在离开语句块时自动调用Dispose方法。   这里需要注意的是,如果基类实现了IDispose接口,那么它的派生类也必须实现自己的IDispose,并在其Dispose方法中调用基类中Dispose方法。只有这样的才能保证当你使用派生类实例后,释放资源时,连同基类中的非托管资源一起释放掉。   插曲:使用using与try+finally的区别   可以说2者没有任何区别,因为using只是编辑器级的优化,它与try+finally有着相同的作用,以下是一段使用using的代码,它在IL阶段也是以try+finally呈现的:   C#:   MSIL:   但是,using的优点是,在代码离开using块时,using会自动调用Idispose接口的Dispose()方法。 Code public partial class _Default : System.Web.UI

构造函数和析构函数中抛出异常

主宰稳场 提交于 2020-02-15 09:47:11
文章目录 1 构造函数中抛出异常 2 析构函数中的异常 1 构造函数中抛出异常 如果构造函数中抛出异常会发生什么情况? 构造函数中抛出异常: 构造过程立即停止。 当前对象无法生成。 析构函数不会被调用。 对象所占的空间立即收回。 工程中的建议: 不要在构造函数中抛出异常。 当构造函数可能产生异常时,使用二阶构造模式。 编程实验:构造函数中的异常 # include <iostream> # include <string> using namespace std ; class Test { public : Test ( ) { cout << "Test()" << endl ; throw 0 ; } virtual ~ Test ( ) { cout << "~Test()" << endl ; } } ; int main ( int argc , char * argv [ ] ) { Test * p = reinterpret_cast < Test * > ( 1 ) ; try { p = new Test ( ) ; } catch ( . . . ) { cout << "Exception..." << endl ; } cout << "p = " << p << endl ; return 0 ; } Linux下可以使用如下工具判断是否有内存泄漏:

C++总结(四)

主宰稳场 提交于 2020-02-15 02:23:48
一、多态 1.多态的概念 多态:同一个事物,在不同场景下表现出的不同的状态 2.多态的分类 静态多态(早绑定,静态联编): 在编译期间,根据所传递的实参类型或者实例化的类型,来确定到底应该调用那个函数即:在编译期间确定了函数的行为—函数重载、模板 动态多态(晚绑定,动态联编):在程序运行时,确定具体应该调用那个函数 3.动态多态的实现条件-- -在继承的体系中 虚函数&重写:基类中必须包含有虚函数(被virtual修饰的成员函数),派生类必须要对基类的虚函数进行重写 关于虚函数调用:必须通过基类的指针或引用调用虚函数 体现:在程序运行时,基类的指针或引用指向那个子类的对象,就会调用那个子类的虚函数 4.重写 1.基类中的函数一定是虚函数 2.派生类虚函数必须与基类虚函数的原型一致:返回值类型 函数名字(参数列表) 例外: a、协变–基类虚函数返回值基类的指针或引用 派生类虚函数返回派生类的指针或引用基类虚函数和派生类虚函数的返回值类型可以不同 b、析构函数:如果将基类中析构函数设置成虚函数,派生类的析构函数提供,两个析构函数就可以构成重写;两个析构函数名字不同 3.基类虚函数可以和派生类虚函数的访问权限不一-样 4、为了让编译器在编译期间帮助用户检测是否重写成功,C+ +11提供非常有用的关键字 1、override:专门]让编译帮助用户检测派生类是否成功重写了基类的虚函数

python里面的'析构函数' del

泪湿孤枕 提交于 2020-02-15 02:16:38
del (self)函数是指对象在被销毁时自动调用的,类似与c++里的析构函数,同理__innt__函数也是如此,在对象被创建时自动调用 类函数中第一个参数必须为self,表示的是当前对象 class Cat : def __init__ ( self , name ) : self . name = name def __del__ ( self ) : print ( '%s不见了' % self . name ) def hello ( self ) : print ( '猫咪:%s' % self . name ) cat = Cat ( 'Tom' ) cat . hello ( ) 来源: CSDN 作者: 房东的jian 链接: https://blog.csdn.net/qq_45202835/article/details/104320357