malloc/free new/delete
2016-07-14 21:09
246 查看
相同点:
都可用于申请动态内存和释放内存
不同点:
1)malloc与free是C/C++标准库函数,new/delete是C++的运算符
2)new自动计算需要分配的空间,而malloc需要手工计算字节数
3)new是类型安全的,而malloc不是,比如
4)new 调用operator new 分配足够的空间,并调用相关对象的构造函数,而malloc不能调用构造函数;delete将调用该实例的析构函数,然后调用类的operator delete,以释放该实例空间,而free不能调用析构函数
5)malloc/free需要库文件支持,new/delete不需要
2)调用基类的构造函数完成基类成员的初始化;
3)若派生类中含对象成员、const成员或引用成员,则必须在初始化列表中完成其初始化;
4)派生类构造函数执行;
2)覆盖:在派生类中覆盖基类中的同名函数,要求基类函数必须是虚函数,且要求基类和子类中的成员函数完全相同(形参列表、函数返回值);
3)隐藏:两种情况
两个函数参数相同,但基类函数不是虚函数——和覆盖的区别在于基类函数是否是虚函数
两个函数参数不同,无论基类是否是虚函数,基类函数都会被屏蔽——和重载区别在于是否在同一个类中
都可用于申请动态内存和释放内存
不同点:
1)malloc与free是C/C++标准库函数,new/delete是C++的运算符
2)new自动计算需要分配的空间,而malloc需要手工计算字节数
3)new是类型安全的,而malloc不是,比如
int* p = new float[2] ; //编译时错误 int* p = (int*)malloc(2*sizeof(double)); //编译时无法指出错误
4)new 调用operator new 分配足够的空间,并调用相关对象的构造函数,而malloc不能调用构造函数;delete将调用该实例的析构函数,然后调用类的operator delete,以释放该实例空间,而free不能调用析构函数
5)malloc/free需要库文件支持,new/delete不需要
1)没有默认构造函数的类类型的成员,以及const类型的成员变量和引用类型的成员变量,必须在构造函数的初始化列表中进行初始化。
2)虽然构造函数不能被定义成虚函数,但析构函数可以定义为虚函数,一般来说,如果类中定义了虚函数,析构函数也应被定义成虚析构函数,尤其是类内有申请的动态内存,需要清理和释放的时候。这是因为当基类指针pA指向用new运算符生成的派生类对象B时,delete基类指针时,只会运行基类的析构函数,而不会执行派生类的析构函数,派生类部分没有释放掉从而造成释放不彻底现象。
派生类构造函数调用顺序:
1)完成对象所占整块内存的开辟,由系统在调用构造函数时自动完成;2)调用基类的构造函数完成基类成员的初始化;
3)若派生类中含对象成员、const成员或引用成员,则必须在初始化列表中完成其初始化;
4)派生类构造函数执行;
成员函数重载、覆盖、隐藏
1)重载:和普通函数重载没有区别,与成员函数是否是虚函数无关,通过形参个数及形参类型来决定,不能通过返回值来决定;2)覆盖:在派生类中覆盖基类中的同名函数,要求基类函数必须是虚函数,且要求基类和子类中的成员函数完全相同(形参列表、函数返回值);
3)隐藏:两种情况
两个函数参数相同,但基类函数不是虚函数——和覆盖的区别在于基类函数是否是虚函数
两个函数参数不同,无论基类是否是虚函数,基类函数都会被屏蔽——和重载区别在于是否在同一个类中
相关文章推荐
- some new eigrp feature
- 深入理解C#中new、override、virtual关键字的区别
- 详解C#编程中构造函数的使用
- .net(c#)中的new关键字详细介绍
- Rails Routes中new、collection、member的区别浅析
- C++中拷贝构造函数的应用详解
- 完全掌握C++编程中构造函数使用的超级学习教程
- 详解C++中如何将构造函数或析构函数的访问权限定为private
- C++聚合关系类的构造函数的调用顺序详解
- 构造函数不能声明为虚函数的原因及分析
- 深入讲解C++中的构造函数
- c语言中malloc、realloc与calloc 的区别以及联系
- C++类成员构造函数和析构函数顺序示例详细讲解
- C++表达式new与delete知识详解
- C++中new与delete、malloc与free应用分析
- C#中构造函数和析构函数用法实例详解
- 基于C# 中可以new一个接口?的问题分析
- c++基础语法:构造函数与析构函数
- JavaScript 构造函数 面相对象学习必备知识
- 关于c++ new的三种使用方式