C++中new/delete与malloc/free的区别小结
作者:Arman_
本文主要介绍了C++中new/delete与malloc/free的区别小结, malloc、free是C中的库函数 new、delete 是C++当中的操作符,读者可以更好地理解C++中内存管理的方式和优势
分配内存的位置
- 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中使用,但需要手动管理对象的构造和析构。
// 使用 malloc 分配内存 并 强制类型转换 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);
到此这篇关于C++中new/delete与malloc/free的区别小结的文章就介绍到这了,更多相关C++ new/delete与malloc/free内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!