定位new运算符

动态分配地址往往将被随机放在堆中,c++提供了一个新的方法,以便程序员可以定位放入动态变量。以下代码对动态定位运算符进行说明:

#include 
using namespace std;
// 创建外部链接性的数组
char stuff[200];
// 创建内部链接性常量,有const 和 有static 是一个样的,
// 但限定该变量不能改变
const int N = 5;
int main()
{
    /*检验定位new运算符**/
    int* TY1 = new int[N];
    // 创建定位new运算符
    int* CT1 = new(stuff) int[N];
    // 赋值
    for (int i = 0; i < N; i++)
    {
        TY1[i] = i;
        CT1[i] = i;
    }
    // 显示
    for (int i = 0; i < N; i++)
    {
        cout << "new :" << TY1[i] << ",address : " << &(TY1[i]) << "\t static :" << CT1[i] << ",address : " << (void*)&(CT1[i]) << endl;   
    }
    cout << endl;

    /*检验定位new运算符**/
    int* TY2 = new int[N];
    // 创建定位new运算符
    int* CT2 = new(stuff) int[N];
    for (int i = 0; i < N; i++)
    {
        TY2[i] = i;
        CT2[i] = i;
    }
    // 显示
    for (int i = 0; i < N; i++)
    {
        cout << "new :" << TY2[i] << ",address : " << &(TY2[i]) << "\t static :" << CT2[i] << ",address : " << (void*)&(CT2[i]) << endl;
    }
    delete [] TY1 ;
}

该代码将CT1定位在stuff中,运行结果如下所示:

定位new运算符_第1张图片

值得注意的是,当我们申明了新变量 TY2和CT2的时候,可以看到TY2和TY1 的地址一样,但CT2和CT1 的地址是不一样的,这是因为使用了定位new运算符之后,将CT2和CT1都定在stuff的位置(即静态存储)解决方案:程序员手动计算平移存储位置。

比如    int* CT1 = new(stuff+sizeof(int)) int[N];  便可实现手动位置平移。

正常情况下使用new申请的空间,必须使用delete进行删除,比如上述代码的TY2但对于定位new运算符申请的空间,由于是动态空间,所以无法使用delete进行删除。

你可能感兴趣的:(蓝桥杯,c++,拓扑学)