# 六. new和delete

  • 运算符new用于内存分配的最基本语法形式为:指针变量 = new 类型名;

​ 也可申请连续空间指针变量 = new 类型名[个数];

  • 运算符delete用于释放new分配的内存空间,基本语法形式:delete 指针变量;
  • 二者作用与C语言中的malloc和free类似

在C++中,使用new关键字来动态分配内存时,该内存区域的内容是未初始化的,也就是说它不会自动被赋予任何特定的值。分配的内存区域的内容将是随机的,取决于之前该内存区域存储了什么

你可以通过以下几种方式为通过new分配的内存空间赋值:

  1. 直接赋值:在分配内存后立即为对象赋值
int* ptr = new int;

*ptr = 10; // 直接为分配的内存空间赋值
1
2
3

​ 2. 使用初始化列表:对于自定义的类或结构体,你可以在new表达式中使用初始化列表

class MyClass {
public:
    int x;
    MyClass(int val) : x(val) {}
};

MyClass* ptr = new MyClass(5); // 使用初始化列表为x赋值
1
2
3
4
5
6
7

​ 3. 使用值初始化:对于基本数据类型,你可以使用()来进行值初始化,但这在C++中通常只适用于类类型,并且该类需要有一个接受无参数的构造函数。对于基本类型,如int、double等,直接使用new int()会将其初始化为0(对于基本类型的内置值类型,这是未指定行为的,但在实践中,对于大多数编译器和平台,它通常会被初始化为0)。

int* ptr = new int(10); // 使用值初始化,但这里的10是赋给新创建的int对象的值
// 注意:对于int,直接使用new int()可能会将其初始化为0,但这取决于实现

double* dptr = new double(3.14); // 同样,为double类型的对象赋值
1
2
3
4

​ 4. 使用列表初始化(C++11及更高版本):你可以使用大括号{}进行列表初始化。

int* ptr = new int{10}; // 使用列表初始化(在C++11及更高版本中有效)
1

​ 5. 对于数组:当你使用new[]为数组分配内存时,你可以使用初始化列表或循环来初始化数组元素。

int* arr = new int[5]{1, 2, 3, 4, 5}; // 使用初始化列表为数组赋值
// 或者
int* arr = new int[5];
for (int i = 0; i < 5; ++i) {
    arr[i] = i + 1; // 使用循环为数组元素赋值
}
1
2
3
4
5
6

​ 6. 使用std::initializer_list(对于接受该类型的构造函数):如果你的类接受一个std::initializer_list作为参数,你可以使用大括号初始化。

注意,使用new分配的内存需要手动使用delete(对于单个对象)或delete[](对于数组)来释放,以避免内存泄漏

上次更新时间:: 2/9/2025, 9:12:58 PM