MST

星途 面试题库

面试题:C++中动态内存分配的方式及区别

请阐述C++中使用`new`和`malloc`进行动态内存分配的方式,并详细说明它们之间在用法、内存管理、返回值等方面的区别。
31.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

1. 动态内存分配方式

  • new运算符
    • 在C++中,new用于动态分配内存并初始化对象。例如,分配一个int类型的变量:int* ptr = new int;,这不仅分配了足够存储int类型数据的内存,还调用了int类型的默认构造函数(对于基本类型,默认构造函数无实际操作)。如果要分配一个包含初始值的int变量,可以写成int* ptr = new int(5);
    • 分配数组时使用new[],如int* arr = new int[10];,这里会为10个int类型的元素分配连续的内存空间,并依次调用每个元素的默认构造函数(对于基本类型无实际操作)。
  • malloc函数
    • malloc是C标准库函数,用于分配指定字节数的内存。例如,分配一个int类型变量的内存:int* ptr = (int*)malloc(sizeof(int));。它只负责分配内存,不会调用构造函数。
    • 分配数组时,同样根据所需总字节数进行分配,如int* arr = (int*)malloc(10 * sizeof(int));,同样不会调用构造函数。

2. 区别

  • 用法区别
    • 语法形式new是C++的运算符,使用简单直观,直接跟数据类型;malloc是函数,需要传入要分配的字节数。例如new intmalloc(sizeof(int))
    • 对象初始化new会调用对象的构造函数进行初始化(对于自定义类型),而malloc不会,它只是分配内存空间。比如有一个自定义类class MyClass {public: MyClass() { std::cout << "Constructor called" << std::endl; } };MyClass* obj1 = new MyClass;会输出构造函数中的信息,而MyClass* obj2 = (MyClass*)malloc(sizeof(MyClass));不会调用构造函数。
    • 数组分配new[]分配数组时会记录数组大小(以便delete[]正确释放),malloc分配数组只是分配一块连续内存,没有数组大小的记录。
  • 内存管理区别
    • 释放方式new分配的内存用delete释放,new[]分配的内存用delete[]释放,如delete ptr;delete[] arr;malloc分配的内存用free释放,如free(ptr);free(arr);。如果释放方式不匹配,会导致内存泄漏或未定义行为。
    • 异常处理new在内存分配失败时会抛出std::bad_alloc异常,而malloc在内存分配失败时返回NULL。例如:
try {
    int* ptr = new int;
} catch (const std::bad_alloc& e) {
    std::cerr << "Memory allocation failed: " << e.what() << std::endl;
}
int* ptr2 = (int*)malloc(sizeof(int));
if (ptr2 == NULL) {
    std::cerr << "Memory allocation failed" << std::endl;
}
  • 返回值区别
    • new返回指向分配内存的对象类型指针,类型安全,无需显式类型转换。例如int* ptr = new int;
    • malloc返回void*类型指针,使用时需要显式类型转换为所需类型指针,如int* ptr = (int*)malloc(sizeof(int));