乐闻世界logo
搜索文章和话题

new/delete和malloc/free之间有什么区别?

7 个月前提问
5 个月前修改
浏览次数34

1个答案

1

在C++编程中,new/deletemalloc/free都是用于动态内存分配和释放的工具,但它们之间存在一些关键的区别:

1. 构造函数和析构函数

new/delete

  • new 在分配内存的同时调用对象的构造函数,这意味着它不仅仅是分配内存,还会初始化对象。
  • delete 在释放内存之前会调用对象的析构函数,确保正确的清理工作。

例如,假设有一个类Person,类中定义了构造函数和析构函数,new会自动调用构造函数,delete会自动调用析构函数:

cpp
class Person { public: Person() { cout << "Constructor called" << endl; } ~Person() { cout << "Destructor called" << endl; } }; Person *p = new Person(); // 自动调用构造函数 delete p; // 自动调用析构函数

malloc/free

  • malloc 仅仅是分配指定大小的内存块,不会调用构造函数。
  • free 只是释放内存,不会调用析构函数。
cpp
Person *p = (Person*)malloc(sizeof(Person)); // 不会调用构造函数 free(p); // 不会调用析构函数

2. 类型安全

  • new 是类型安全的,它直接返回正确的类型指针,不需要类型转换。
  • malloc 返回的是void*,需要强制类型转换到具体的类型指针。
cpp
Person *p = new Person(); // 返回Person*类型 Person *q = (Person*)malloc(sizeof(Person)); // 需要转换类型

3. 错误处理

  • new 在无法分配内存时抛出一个异常(std::bad_alloc),这可以通过异常处理机制进行捕获和处理。
  • malloc 在分配失败时返回NULL,需要通过检查返回值来处理错误。
cpp
try { Person *p = new Person(); } catch (std::bad_alloc &e) { cout << "Memory allocation failed: " << e.what() << endl; } Person *q = (Person*)malloc(sizeof(Person)); if (!q) { cout << "Memory allocation failed" << endl; }

4. 分配方式和效率

  • new 可能相比malloc有更多的开销,因为它还涉及到构造函数的调用。
  • malloc 可能在某些情况下更快,因为它仅仅是分配内存。

总结来说,new/delete 提供了更高级的功能,例如自动的构造函数和析构函数调用,类型安全和异常处理,而malloc/free 提供了基础的内存分配和释放功能,使用起来需要更多的手动控制和错误检查。在C++中通常推荐使用new/delete,因为它们更适合C++的面向对象特性。

2024年6月29日 12:07 回复

你的答案