MST

星途 面试题库

面试题:C++中malloc和new在内存分配时对类型处理的差异

请阐述在C++中,malloc和new在内存分配过程中,对于所分配内存对应的类型处理方式有何不同,并举例说明。
44.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 类型处理方式不同
    • malloc
      • malloc是C标准库函数,它只管分配指定字节数的内存空间,不关心所分配内存的具体类型。它返回的是void*类型指针,使用时需要强制类型转换为所需的类型指针。
    • new
      • new是C++的关键字,它在分配内存时会根据要创建的对象类型进行内存分配和初始化。它会调用对象的构造函数来完成对象的初始化工作,并且返回的指针类型就是所创建对象的类型指针,无需额外的强制类型转换。
  2. 举例说明
    • 使用malloc
#include <stdio.h>
#include <stdlib.h>

class MyClass {
public:
    MyClass() {
        printf("MyClass constructor called\n");
    }
    ~MyClass() {
        printf("MyClass destructor called\n");
    }
};

int main() {
    // 使用malloc分配MyClass对象的内存
    MyClass* obj1 = (MyClass*)malloc(sizeof(MyClass));
    if (obj1 == nullptr) {
        printf("Memory allocation failed\n");
        return 1;
    }
    // 此时obj1指向的内存未初始化,需要手动调用构造函数
    new (obj1) MyClass();
    // 使用obj1
    // 用完后手动调用析构函数并释放内存
    obj1->~MyClass();
    free(obj1);
    return 0;
}
  • 使用new
#include <iostream>

class MyClass {
public:
    MyClass() {
        std::cout << "MyClass constructor called" << std::endl;
    }
    ~MyClass() {
        std::cout << "MyClass destructor called" << std::endl;
    }
};

int main() {
    // 使用new分配并初始化MyClass对象
    MyClass* obj2 = new MyClass();
    if (obj2 == nullptr) {
        std::cout << "Memory allocation failed" << std::endl;
        return 1;
    }
    // 使用obj2
    // 用完后释放内存,会自动调用析构函数
    delete obj2;
    return 0;
}

在上述例子中,malloc分配内存后需要手动调用构造函数初始化对象,释放内存前也要手动调用析构函数;而new在分配内存的同时就调用构造函数初始化对象,delete在释放内存时自动调用析构函数。