内存管理--C++关键字
内存管理–C++关键字
new
使用示例 :
int* ptr = new int;申请该对象大小的内存 **_(由 operator new)_**来完成
将内存绑定到声明的指针变量
通过该指针变量调用其构造函数 使用 new 时带有参数,则传递相应的参数
该操作(通过指针调用其构造函数) 只能由编译器调用
不可重载
new[]
- 使用示例 :
int* ptr = new int[size]; - 申请 size * 对象大小的内存 **_(由 operator new)_**来完成
- 将内存绑定到声明的指针变量
- 通过该变量,调用 size次构造函数,传递时带有参数,则传递相应的参数
- 不可重载
operator new
- 使用示例 :
int* temp = operator new(sizeof(int)); - 内部实际是调用 mallloc 函数
- 可以发生重载
new()
使用示例 :
int* ptr2 = new(ptr)int使用 new()表示**由程序员自己来决定地址空间的首地址**
指定的首地址在示例中,即 ptr 的地址
申请空间的大小为对应的类型大小,示例中的类型为 int, 则对应的大小为 4 字节
delete
- 使用示例 :
delelte ptr; - 调用该指针对应对象的析构函数
- 释放该指针的内存空间
delete[]
- 使用示例:
delete[] arrayPtr - 调用该指针下所有对象的析构函数
- 释放该指针所对应的空间
operator delete
- 使用示例 :
delete intPtr(4); - 释放该指针,需要大小一致
- 内部调用 free 函数
- 可以发生重载
为什么 new[]和 delete[]需要成对使用
避免产生内存泄漏
内存泄漏的产生根本原因不在于本身对象没有被释放,而是当本身对象内含指针时,并且由其析构函数来 delete 该指针时,造成内存泄漏
核心是因为delete 来删除数组对象时, 只有第一个对象所对应的析构函数被调用
而使用 delete[]释放数组对象,数组中每一个对象的析构函数都会被调用
总结
| 申请内存 | 释放内存 | 是否可重载 |
|---|---|---|
| new | delete | 否 |
| new[] | delete[] | 否 |
| new() | 标准未提供 | 否 |
| operator new | operator delete | 是 |



