new
new是 C++ 的一个运算符,用于动态分配对象在堆内存中的空间。它不仅负责内存分配,还会调用对象的构造函数。
分配基本的数据类型
int* pInt = new int; // 分配一个 int 类型的内存
*pInt = 10; // 使用分配的内存
分配数组
int* pArray = new int[5]; // 分配一个整数数组,包含 5 个元素
分配对象
class MyClass {
public: MyClass() { /* 构造代码 */ }
}; MyClass* pObj = new MyClass(); // 动态分配 MyClass 对象
释放内存
使用delete释放new申请的内存,如果new申请的是数组格式的内存,用delete[]释放
delete pInt; // 释放单个对象
delete[] pArray; // 释放数组
delete pObj; // 释放对象
重载
new是运算符可以重载,特别的,布局new的就不需要为对象分配内存,而是指定了一个地址作为内存起始区域,new在这段内存上为对象调用构造函数完成初始化工作,并返回此地址
//这些版本可能抛出异常
void * operator new(size_t);
void * operator new[](size_t);
void * operator delete (void * )noexcept;
void * operator delete[](void *0)noexcept;
//这些版本承诺不抛出异常
void * operator new(size_t ,nothrow_t&) noexcept;
void * operator new[](size_t, nothrow_t& );
void * operator delete (void *,nothrow_t& )noexcept;
void * operator delete[](void *0,nothrow_t& )noexcept;
malloc
malloc是 C 标准库中的一个函数,用于动态分配内存块。它只负责分配内存空间,不会调用构造函数。
分配内存
int* pInt = (int*)malloc(sizeof(int)); // 分配一个 int 的内存,注意需要提供大小
*pInt = 10; // 使用分配的内存
分配数组
int* pArray = (int*)malloc(5 * sizeof(int)); // 分配一个包含 5 个 int 的数组
释放内存
free(pInt); // 释放内存
free(pArray); // 释放数组的内存
重载
malloc不可以重载
总结
- 函数体 :delete(new)会先执行析构函数 再执行free(malloc)
- 返回值: new返回值不需要强转,malloc返回值需要强转
- 参数:new不需要传入具体的字节个数 malloc需要传具体字节个数
- new会先执行malloc 再执行构造函数给成员变量赋值,malloc只分配堆区内存
- 申请失败: new申请失败会抛出异常,malloc会反空
- 名字:new是运算符,malloc是函数
- delete:先调用析构函数(释放堆区内存),在调用free(释放栈区内存)
- new操作符从自由存储区上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。自由存储区不等于堆,