1.介绍
在C++中,new是一个用于动态内存分配的关键字。它允许程序在运行时从堆(heap)中分配内存,并返回指向该内存的指针。new是 C++ 中管理动态内存的主要方式之一,与 C 语言中的malloc类似,但new更安全和强大,因为它会自动调用构造函数并支持异常处理。
2.new基本用法
(1)分配基本类型
pointer = new type;
type 是要分配内存的数据类型(例如int double等)。
pointer是指向分配内存的指针。例如
int* ptr = new int; // 分配一个 int 类型的内存
*ptr = 10; // 给分配的内存赋值
std::cout << *ptr; // 输出 10
delete ptr; // 释放内存
(2)分配数组
new也可以用于分配数组内存,
pointer = new type[size];
size是数组的大小。
分配的内存必须用delete[]释放。例如
int* arr = new int[5]; // 分配一个包含 5 个整数的数组
for (int i = 0; i < 5; i++) {
arr[i] = i + 1; // 初始化数组
}
delete[] arr; // 释放数组内存
(3)初始化动态分配的内存
new支持在分配内存时进行初始化。例如
int* ptr = new int(42); // 分配内存并初始化为 42
std::cout << *ptr; // 输出 42
delete ptr;
//(C++11以上)
int* arr = new int[5]{1, 2, 3, 4, 5}; // 分配并初始化数组
delete[] arr;
(4)分配对象
new会自动调用对象的构造函数。例如
class MyClass {
public:
MyClass() {
std::cout << "构造函数调用\n";
}
~MyClass() {
std::cout << "析构函数调用\n";
}
};
MyClass* obj = new MyClass; // 调用构造函数
delete obj; // 调用析构函数
(5)异常处理
如果内存分配失败,new会抛出bad::bad_alloc异常。可以使用try-catch块捕获异常。例如
try {
int* ptr = new int[1000000000000]; // 尝试分配大量内存
} catch (const std::bad_alloc& e) {
std::cerr << "内存分配失败: " << e.what() << "\n";
}
(6)new和delete的配对
每次使用new分配内存后,必须使用delete释放内存,否者会导致内存泄漏。
对于单个对象,使用delete。
对于数组,使用delete[]。例如
int* ptr = new int; // 分配单个 int
delete ptr; // 释放单个 int
int* arr = new int[10]; // 分配数组
delete[] arr; // 释放数组
3.new与malloc的区别
特性 | new | malloc |
---|---|---|
语言 | C++ | C |
调用构造函数 | 是 | 否 |
调用析构函数 | 是 | 否 |
返回类型 | 类型安全的指针(如int*) | void*(需要强制类型转换) |
异常处理 | 抛出bad_alloc异常 | 返回NULL |
内存大小计算 | 自动计算 | 手动计算 |
4.定位new
定位new允许在已经分配的内存上构造对象。它不分配内存,而是在指定的内存地址调用构造函数。例如
#include <new> // 必须包含 <new> 头文件
char buffer[sizeof(MyClass)]; // 预分配内存
MyClass* obj = new (buffer) MyClass; // 在 buffer 上构造对象
obj->~MyClass(); // 显式调用析构函数
5.new的替代方案
虽然new提供了灵活的动态内存管理,但在现代C++中,推荐使用智能指针或标准库容器来避免手动管理内存。例如
#include <memory> // 智能指针头文件
std::unique_ptr<int> ptr = std::make_unique<int>(10); // 自动管理内存
std::cout << *ptr; // 输出 10
// 不需要手动调用 delete
6.总结
-
new用于动态分配内存,并返回指向该内存的指针。
-
new会自动调用构造函数,delete会自动调用析构函数。
-
分配数组时使用 new[],释放时使用delete[]。
-
推荐使用智能指针或标准库容器替代手动管理内存。
-
定位new允许在指定内存地址构造对象。
如有错误,敬请指正!!!