定位 new 运算符

定位 new 运算符:

和普通的new 运算符在堆上随机分配内存相比,定位 new 运算符可以在特定的地址位置

定位 new 运算符的具体使用实例:

const int BUF = 512;
const int N = 5;
char buffer[BUF];
void Part9::newplace(){
        double *pd1, *pd2;
        int i;
        cout<<"Calling new and placement new:\n";
        pd1 = new double[N];
        //在 buffer 上给指针申请空间
        pd2 = new (buffer) double[N];   //use buffer array
        for(int i = 0; i < N; i++)
                pd2[i] = pd1[i] = 1000 + 20.0*i;
        cout<<"Memory addresses:\n"<<" heap:"<<pd1<<" static:"<<(void *)buffer<<endl;
        cout<<"Memory contents:\n";
        for(i = 0; i < N; i++){
                cout<<pd1[i]<<" at "<<&pd1[i]<<"; ";
                cout<<pd2[i]<<" at "<<&pd2[i]<<endl;
        }

        cout<<"\nCalling new and placement new a second time:\n";
        double *pd3, *pd4;
        pd3 = new double[N];                    //find new address
        pd4 = new (buffer) double[N];   //overwrite old data
        for(i = 0; i < N;i++)
                pd4[i] = pd3[i] = 1000 + 40.0 * i;
        cout<<"Memory contents:\n";
        for(i = 0; i < N; i++){
                cout<<pd3[i]<<" at "<<&pd3[i]<<"; ";
                cout<<pd4[i]<<" at "<<&pd4[i]<<endl;
        }
        cout<<"\nCalling new and placement new a third time:\n";
        delete []  pd1;
        pd1 = new double[N];
        pd2 = new (buffer + N*sizeof(double)) double[N];
        for(i = 0; i < N; i++)
                pd2[i] = pd1[i] = 1000 + 60.0*i;
        cout<<"Memory contents:\n";
        for(i = 0; i <N;i++){
                cout<<pd1[i]<<" at "<<&pd1[i]<<"; ";
                cout<<pd2[i]<<" at "<<&pd2[i]<<endl;
        }
        delete [] pd1;
        delete [] pd3;
}
调用主函数:
#include <iostream>
#include <new>
using namespace std;
int main()
{
        newplace();
        return 0;
}

定位new 的其他形式,定位 new 运算符其实是 new 的重载实现,通过 new函数 以 void* 形式返回申请到的地址,不能使用delete 进行空间的释放

int *p1 = new int;                              //调用 new(sizeof(int))
int *p2 = new (buffer) int;                 //调用 new(sizeof(int), buffer)
int *p3 = new (buffter) int[40];          //调用 new(sizeof(40*sizeof(int)),  buffer)</span>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值