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



發佈了31 篇原創文章 · 獲贊 11 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章