面试题答案
一键面试错误处理机制对程序健壮性和使用场景的影响
- new操作符
- 程序健壮性:使用
new
时,若内存分配失败抛出异常,可在try - catch
块中捕获异常进行统一的错误处理,有助于增强程序的健壮性。例如在一个复杂的函数调用链中,new
失败抛出异常能及时终止后续可能依赖该内存的错误操作,避免程序出现未定义行为。 - 使用场景:适用于需要严格错误处理的场景,比如在面向对象编程中,对象构造时使用
new
分配内存,如果分配失败抛出异常,可保证对象构造失败,不会出现部分构造的对象。常用于对程序稳定性要求较高的应用程序开发,如大型企业级软件。
- 程序健壮性:使用
- malloc函数
- 程序健壮性:
malloc
返回NULL
,调用者需要每次手动检查返回值。若忘记检查,程序可能在使用NULL
指针时崩溃,降低了程序的健壮性。例如在一个包含多个malloc
调用的函数中,很容易遗漏对某个malloc
返回值的检查。 - 使用场景:适用于对性能要求较高且对错误处理可以自行妥善处理的场景。在一些底层库开发中,开发者对内存分配失败有自己独特的处理方式,此时
malloc
的简单返回NULL
模式更灵活。例如在一些嵌入式系统开发中,内存资源紧张,开发者可能希望在malloc
失败时尝试其他内存管理策略而不是简单抛出异常。
- 程序健壮性:
内存初始化方面的不同点
- new操作符
- 对于
new
分配单个对象,会调用对象的构造函数进行初始化。例如int* ptr = new int(5);
,不仅分配了内存,还将int
初始化为5。 - 对于
new[]
分配数组,会对数组中的每个元素调用构造函数进行初始化。例如MyClass* arr = new MyClass[10];
,数组中的10个MyClass
对象都会调用其默认构造函数进行初始化。
- 对于
- malloc函数
malloc
分配的内存不会进行初始化,只是分配指定大小的未初始化内存块。例如int* ptr = (int*)malloc(sizeof(int));
,此时ptr
指向的内存区域的值是未定义的。若要初始化,需要额外调用如memset
(对于简单类型)或手动对对象调用构造函数(对于自定义类型,不过这种情况很少见,因为malloc
不适合分配对象)等函数。