new/delete 与 malloc/free 的区别?
- 分配内存的位置
- malloc是从
堆
上动态分配内存 - new是从
自由存储区
为对象动态分配内存。自由存储区的位置取决于operator new的实现。自由存储区不仅可以为堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存
- 是否可以被重载
- opeartor new 、operator delete 可以被重载
- malloc、free则不能重载
- 内存分配
- malloc内存分配成功后返回void*,然后再
强制类型转换为需要的类型
- malloc内存分配失败后返回 NULL
- new操作符分配内存成功后返回与对象类型相匹配的指针类型;因此new是符合类型安全的操作符
- new分配内存失败则会抛异常 std::bad_alloc
- 如果加上
std::nothrow
关键字`,UserInfo* info = new (std::nothrow) UserInfo; // new 就不会抛出异常而是会返回空指针
- 分配内存的大小的计算
- 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息
自行计算
- malloc则需要
显式
地指出所需内存的尺寸
- 使用场景
- new/delete 适用于C++对象,它们会自动处理对象的构造和析构。
- malloc/free 更通用,可以在C++中使用,也可以在C中使用,但需要手动管理对象的构造和析构。
UserInfo* user = static_cast<UserInfo*>(malloc(sizeof(UserInfo)));
new (user) UserInfo("Alice", 25);
std::cout << "User's age: " << user->getAge() << std::endl;
user->~UserInfo();
free(user);