📜  C++ 中的 new 与运算符new(1)

📅  最后修改于: 2023-12-03 15:13:58.501000             🧑  作者: Mango

C++ 中的 new 与运算符 new

在 C++ 中,new 和运算符 new 都用于在堆上分配内存空间并返回指向该空间的指针。然而,它们有一些关键的区别。

运算符 new

从语法上看,运算符 new 只是一种用于动态分配内存的操作符。它使用以下语法进行分配:

pointer_variable = new data_type;

其中,pointer_variable 是指向 data_type 数据类型的指针。运算符 new 会在堆上分配足够的内存来存储 data_type 的对象,并将其地址赋给指针变量。

例如,以下代码分配了一个 int 类型的对象并将其地址赋给指针变量 ptr

int* ptr = new int;

在分配内存时,运算符 new 首先计算需要的内存空间大小,然后找到合适的空间,并返回指向该空间的指针。如果失败,它会引发 std::bad_alloc 异常。

需要注意的是,使用运算符 new 分配的内存必须通过运算符 delete 或 delete[] 进行释放,以避免内存泄漏。

new 关键字

new 是 C++ 中的关键字,它与运算符 new 一起使用,具有更多的功能。

分配单个对象

使用 new 关键字可以在堆上分配单个对象的内存空间,并返回指向该对象的指针。使用 new 关键字的语法如下:

pointer_variable = new data_type;

例如,以下代码分配了一个 int 类型的对象并将其地址赋给指针变量 ptr

int* ptr = new int;

与运算符 new 相同,需要通过 delete 或 delete[] 来释放通过 new 关键字分配的内存。

分配动态数组

new 关键字还可用于在堆上分配动态数组。使用 new 关键字分配动态数组的语法如下:

pointer_variable = new data_type[size];

其中,size 是数组大小,pointer_variable 是指向数组的指针。

例如,以下代码分配了一个包含 5 个 int 元素的数组,并将其首地址赋给指针变量 ptr

int* ptr = new int[5];

同样,通过 delete 或 delete[] 来释放通过 new 关键字分配的动态数组的内存。

需要注意的是,如果使用 new 分配的动态数组,应使用 delete[] 来释放内存,而不是 delete。这是因为 delete[] 方法会调用数组元素的析构函数,而 delete 方法仅销毁单个对象。

总结

运算符 new 和关键字 new 都可以在堆上分配内存空间,并返回指向该空间的指针。运算符 new 仅用于分配内存,而关键字 new 还可以用于分配单个对象和动态数组。使用 new 分配的内存应通过 delete 或 delete[] 释放,以避免内存泄漏。