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