定位new运算符
通常new 负责在堆中找到一个满足要求的内存卡,new运算符还有另一种变体,被称为定位new运算符可以使用指定的位置。可以使用这种特性来设置内存关联规程、处理需要通过特定地址进行访问的硬件或在特定位置创建对象。要使用定位new,需要包含头文件new。
char buffer[100];
int *ptr = new(buffer) int[10]; // 在buffer位置创建一个int数组。
如果buffer不是用常规new分配的堆内存,则不能对new定位运算返回的地址进行delete操作。
new运算符基本上只是返回传递给它的地址,并将其强制转换为void*,以便可以赋给任何指针类型。
#include<iostream>
#include<new>
using namespace std;
int main()
{
char buffer[512]; // 512字节的一块内存
int * p1 = new int[10];
int * p2 = new (buffer)int[10]; // 在buffer位置创建一个10个元素的int数组
for(int i=0;i<10;i++)
{
p1[i] = 10 + i;
p2[i] = 20 + i;
}
cout<<"p1 at "<<p1<<endl;
for(int i=0;i<10;i++)
{
cout<<"p2: "<< p2[i] <<" at " << &p2[i]<<endl;
}
double * p3 = new(buffer)double[10]; // 覆盖之前的p2数组
for(int i=0;i<10;i++)
{
p3[i] = 30 + i;
cout<<"p3: "<< p3[i] <<" at " << &p3[i]<<endl;
}
int * p4 = new(buffer + 10 *sizeof(double)) int[10]; // 在p3数组后面创建一个int数组
for(int i=0;i<10;i++)
{
p4[i] = 40 + i;
cout<<"p4: "<< p4[i] <<" at " << &p4[i]<<endl;
}
delete []p1;
return 0;
}