1) new
和 malloc
的区别及用法
区别:
-
类型安全:
new
是 C++ 运算符,它会调用对象的构造函数并返回正确类型的指针;malloc
是 C 的函数,它返回的是void*
,需要显式转换为目标类型。 -
初始化:
new
在分配内存时会初始化对象(对于基本数据类型,会调用默认构造函数),而malloc
只分配内存,初始值不确定。 -
析构:使用
new
分配的内存需要用delete
释放,而malloc
分配的内存则用free
释放。 -
异常处理:
new
在内存不足时会抛出std::bad_alloc
异常,而malloc
则返回NULL
。
用法:
-
new
:int* p = new int; // 分配一个int *p = 42; // 初始化 delete p; // 释放内存 MyClass* obj = new MyClass(); // 创建对象 delete obj; // 释放对象
-
malloc
:int* p = (int*)malloc(sizeof(int)); // 分配一个int if (p == NULL) { // 处理分配失败 } *p = 42; // 初始化 free(p); // 释放内存
2) malloc
分配失败会导致什么问题
malloc
在内存分配失败时会返回 NULL
。如果程序未检查这个返回值并尝试使用这些无效指针,可能会导致许多问题,包括:
- 崩溃或异常:访问空指针通常会导致程序崩溃。
- 未定义行为:操作 NULL 指针会引发未定义行为,程序可能表现出不可预期的结果。
-
资源泄漏:如果没有检测到
malloc
返回NULL
而继续执行程序,可能会导致资源管理不当,从而造成内存泄漏。
因此,在使用 malloc
时,总是应在使用指针之前检查其是否为 NULL
。