background image

                            

 面试中概念性问题总结

1new  delete 和 malloc free 的区别与联系?

面试中可以这样回答:
都是在堆(heap)上进行动态的内存操作。用 malloc 函数需要指定内存分配的字节数并
且不能初始化对象,new 会自动调用对象的构造函数。delete 会调用对象的析构函数,
而 free 

   

不会调用对象的析构函数。

详细讲解:
① malloc 与 free 是 C++/C 语言的标准库函数,new/delete 是 C++的运算符。它们都用于

在堆(heap)上进行动态的内存操作(申请动态内存和释放内存)。

② delete 不仅会释放空间,在释放前会调用析构函数,和 new 对应,new 调用构造函数,

free 只会释放内存。

③ 对于非内部数据类型的对象而言,光用maloc/free 无法满足动态对象的要求。对象 

在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于
malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构
造函数和析构函数的任务强加于 malloc/free。因此 C++语言需要一个能完成动态内
存分配和初始化工作的运算符 new,以及一个能完成清理与释放内存工作的运算
符 delete。注意 new/delete 不是库函数。

④ C++程序经常要调用 C 函数,其实 new/delete 内部实现也调用了 malloc/free。

而 C 程序只能用 malloc/free 管理动态内存

 

⑤ new 是强制类型的,不需要考虑类型,而 malloc 不是,它返回的指针是 void*型,

必须要强转成需要的类型。(注意)

 

⑥ new 可以调用构造函数在声明的时候初始化,malloc 只是分配空间,需要在其他地

方初始化。而且 malloc 需要指定分配空间大小, 而 new 是自动计算的。

⑦ new/delete 是可以重载的,而重载之后,就成为了函数。当 new/delete 在类中被重载

的时候,可以自定义申请过程,比如记录所申请内存的总长度,以及跟踪每个对
象的指针。

⑧ free 和 delete 可以释放 NULL 指针。

举例说明:

Stu* stu = malloc(sizeof(Stu));   // Stu 是一个类

采用 malloc 初始化,你将不会调用 Stu 的构造方法,而只是单纯的分配空间。而且
我们只认为你是分配一个空间,而不是想创建一个对象。(用于 struct)
Stu * stu = new Stu ();则会调用 Stu 的构造方法来初始化对象,也就是说你既要分
配空间又要初始化这段空间,让它变成一个对象。(用于 class)

delete 与 delete[]的区别

delete 只会调用一次析构函数,而 delete[]会调用每一个成员的析构函数。当 delete

 

操作符用于数组时,它为每个数组元素调用析构函数, delete 与 new 配套,delete 
[]与 new []配套。
 提醒:关于 new 、delete、malloc、free 的区别,大家尽量多的记忆几点,面试的时
侯可以多回答几点。

2、 C++中的 class 和 struct 的区别:

1