new 和 malloc 有什么区别?

newmalloc 都是用来在堆上分配内存的方法,但它们在使用和功能上有一些重要的区别:

  1. 类型安全:
    • new 是 C++ 中的操作符,它不仅分配内存,还会调用对象的构造函数,保证类型安全。这意味着,使用 new 时,你不需要指定分配多少字节的内存,只需指定对象类型。
    • malloc 是 C 语言中的函数,仅分配内存,不调用构造函数。使用 malloc 时,需要指定需要分配的字节大小,且返回的是 void* 类型,通常需要类型转换。
  2. 返回类型:
    • new 返回的是指定类型的指针。
    • malloc 返回的是 void*,需要转换为相应类型的指针。
  3. 失败时的行为:
    • new 在内存分配失败时,会抛出一个异常。
    • malloc 在分配失败时,返回 NULL
  4. 与删除操作配对:
    • new 配对使用 delete 来释放内存,并调用析构函数。
    • malloc 配对使用 free 来释放内存,不调用析构函数。
  5. 重载:
    • newdelete 可以被重载,以提供特殊的内存分配和释放行为。
    • mallocfree 不能被重载。
应用场景举例

假设有一个 Student 类,需要创建一个 Student 对象:

  • 使用 new:
    Student* student = new Student();
    // 这里会调用 Student 的构造函数
    delete student;
    // 这里会调用 Student 的析构函数
    
  • 使用 malloc:
    Student* student = (Student*)malloc(sizeof(Student));
    // 需要手动调用构造函数,通常通过 placement new
    // 构造函数不会自动调用
    free(student);
    // 需要手动调用析构函数,析构函数不会自动调用
    

在 C++ 编程中,推荐使用 newdelete,因为它们提供更好的类型安全性和对象生命周期管理。在一些特殊情况下,例如与 C 代码交互或者自定义内存分配器时,可能会用到 mallocfree

发表评论

后才能评论