您的位置:首页 > 编程语言 > C语言/C++

定位 new 运算符

2016-01-30 19:50 323 查看
定位 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
;
//在 buffer 上给指针申请空间
pd2 = new (buffer) double
;   //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
;                    //find new address
pd4 = new (buffer) double
;   //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
;
pd2 = new (buffer + N*sizeof(double)) double
;
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++