c++面试常见问题汇总

new操作针对数据类型的处理,分为两种情况:

(1) 简单数据类型(包括基本数据类型和不需要构造函数的类型)

  • 简单类型直接调用 operator new 分配内存;
  • 可以通过new_handler 来处理 new 失败的情况;
  • new 分配失败的时候不像 malloc 那样返回 NULL,它直接抛出异常(bad_alloc)。要判断是否分配成功应该用异常捕获的机制;

(2)复杂数据类型(需要由构造函数初始化对象)

  • new 复杂数据类型的时候先调用operator new,然后在分配的内存上调用构造函数

delete也分为两种情况:

(1) 简单数据类型(包括基本数据类型和不需要析构函数的类型)

  • delete简单数据类型默认只是调用free函数。

(2)复杂数据类型(需要由析构函数销毁对象)

  • delete复杂数据类型先调用析构函数再调用operator delete

从原理上来分析可以看看这篇博客:C++ new和delete的实现原理

与 malloc 和 free 的区别:

(1)属性上:new / delete 是c++关键字,需要编译器支持。 malloc/free是库函数,需要c的头文件支持。
(2)参数:使用new操作符申请内存分配时无须制定内存块的大小,编译器会根据类型信息自行计算。而mallco则需要显式地指出所需内存的尺寸。
(3)返回类型:new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,故new是符合类型安全性的操作符。而malloc内存成功分配返回的是void *,需要通过类型转换将其转换为我们需要的类型。
(4)分配失败时:new内存分配失败时抛出bad_alloc异常;malloc分配内存失败时返回 NULL。
(5)自定义类型:new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现)。 malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。
(6)重载:C++允许重载 new/delete 操作符。而malloc为库函数不允许重载。
(7)内存区域:new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。其中自由存储区为:C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。自由存储区不等于堆,如上所述,布局new就可以不位于堆中。

4. struct 和 class 的区别?

(1)首先说一下C中的结构体和C++中的结构体的异同:

(2)C++中 struct 与 class 的区别:

  • 内部成员变

你可能感兴趣的:(c++,面试,java)