常规new运算符
int* ptr = new int[5];
int* ptr = new int(5);
//what is the difference?
在C++中,new int[5]分配了一个足以存储5个整数的内存块,而new int(5)则为一个初始值为5的单个整数分配了内存。
下面是这两者之间的一些关键区别:
存储:new int[5]在连续的内存中分配了一个5个整数的数组,而new int(5)在单独的内存中分配了一个单一的整数。
访问:使用new int[5]后,你可以使用数组索引访问数组中的每个元素,比如ptr[0],ptr[1],等等。在使用new int(5)后,你可以使用指针本身直接访问存储在ptr中的单个整数,像*ptr。
初始化:当你使用new int[5]时,数组默认是不初始化的,所以如果你想设置初始值,你必须手动初始化它。使用new int(5),整数默认被初始化为值5。
解除分配:要取消使用new int[]分配的内存,你必须使用相应的delete[]操作符,如delete[] ptr;。要取消使用new int()分配的内存,\你必须使用delete操作符,比如delete ptr;。
总之,new int[5]用于分配一个整数数组,而new int(5)用于分配单个整数的内存。使用哪一个取决于你的具体要求和你打算如何使用内存。
定位new运算符
通常,new负责在堆(heap)中找到一个足以能够满足要求的内存块。
new运算符还有另一 种变体,被称为定位(placement)new运算符,它让您能够指定要使用的位置。
程序员可能使用这种特性来设置其内存管理规程、处理需要通过特定地址进行访问的硬件或在特定位置创建对象。
要使用定位new特性,首先需要包含头文件new,它提供了这种版本的new运算符的原型;
然后将new运算符用于提供了所需地址的参数。除需要指定参数外,句法与常规new运算符相
同。具体地说,使用定位new运算符时,变量后面可以有方括号,也可以没有。
#include <new>
struct chaff
{
char dross[20];
int slag;
};
char bufferl[50];
char buffer2[500];
int main()
{
chaff* p1, * p2;
int* p3, * p4;
// first, the regular forms of new
pl = new chaff; // place structure in heap
p3 = new int[20]; // place int array in heap
p2 = new(bufferl) chaff; // place structure in bufferl
p4 = new(buffer2)int[20];// place int array in buffer2
return 0;
}
出于简化的目的,这个示例使用两个静态数组来为定位new运算符提供内存空间。因此,上述代码从buffer1中分配空间给结构chaff,从buffer2中分配空间给一个包含20个元素的int数组。
定位new运算符确实将数组p4放在了数组buffer2中。
然而,它们的类型不同,p4是int指针,而buffer是char指针(顺便说一句,输出时,要使用(void*)对buffer进行强制转换,如果不这样做,cout将显示一个字符串)。