定位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;


}
posted @ 2022-06-18 17:28  店里最会撒谎白玉汤  阅读(290)  评论(0)    收藏  举报