malloc/free new/delete

来源:互联网 发布:剑灵捏脸数据怎么下载 编辑:程序博客网 时间:2024/06/08 02:10

相同点:
都可用于申请动态内存和释放内存

不同点:
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)隐藏:两种情况

  • 两个函数参数相同,但基类函数不是虚函数——和覆盖的区别在于基类函数是否是虚函数
  • 两个函数参数不同,无论基类是否是虚函数,基类函数都会被屏蔽——和重载区别在于是否在同一个类中
0 0
原创粉丝点击