在C++中,new
和 delete
是两个关键字,分别用于动态内存分配和释放。
new 关键字
new
关键字用于在堆(heap)上动态地分配内存。当我们使用 new
分配内存时,会得到一个指向该内存块指针。new
的基本用法如下:
Type* pointer = new Type;
这里,Type
是你想要分配的类型的名称,pointer
是一个指向 Type
类型对象的指针。
例如,如果你想要动态地分配一个整数,可以这样做:
int* intPointer = new int;
除了分配单个对象,new
还可以用来分配数组:
int* intArray = new int[10]; // 分配一个包含10个整数的数组
分配后,你可以像使用普通数组一样使用 intArray
。不过,与栈上分配的数组不同,new
分配的数组不会在作用域结束自动销毁。
delete 关键字
与 new
相对应,delete
关键字用于释放 new
分配的内存。使用 delete
可以防止内存泄漏。delete
的基本用法如下:
delete pointer;
这将释放 pointer
指向的内存。例如:
delete intPointer;
如果你使用 new
分配了一个数组,需要使用 delete[]
来释放整个数组的内存:
delete[] intArray;
new 和 delete 的注意事项
- 匹配使用:使用
new
分配的内存必须使用delete
来释放,使用new[]
分配的内存必须使用delete[]
来释放。 - 内存泄漏:如果忘记释放
new
分配的内存,将导致内存泄漏。 - 构造函数和析构函数:当使用
new
分配一个对象时,会调用该对象的构造函数。当使用delete
释放对象时,会调用该对象的析构函数。 - 异常安全:在使用
new
分配内存时,如果后续的代码可能会抛出异常,应该使用异常安全的方式来管理内存分配,比如使用智能指针或者try-catch
块。
示例代码
#include <iostream>
int main() {
int* myInt = new int(7); // 分配一个整数,并初始化为7
int* myArray = new int[10]; // 分配一个包含10个整数的数组
// 使用分配的内存
std::cout << "Value of myInt: " << *myInt << std::endl;
// 释放内存
delete myInt; // 释放单个整数
delete[] myArray; // 释放数组
return 0;
}
在使用 new
和 delete
时,应该小心谨慎,确保每个分配都有对应的释放,以避免内存泄漏和其他内存管理问题。在C++11及以后的版本中,推荐使用智能指针(如 std::unique_ptr
和 std::shared_ptr
)来自动管理内存,从而减少内存泄漏的风险。