首页 > 解决方案 > 为什么两个指针具有相同的内存地址?

问题描述

#include <iostream>

using namespace std;

int main()
{
    char* MainBlock = new char[100];

    char* SubBlock1 = new (MainBlock) char[20];

    char* SubBlock2 = new (MainBlock) char [20];

    cout  << static_cast<void*>(SubBlock1) << " " << static_cast<void*>(SubBlock2);


}

为什么上面代码中的两个指针都有相同的地址?我预计 SubBlock2 在 SubBlock 1 之后是 20 个字节。

这是否意味着即使我只有 100 个字节,我也可以通过放置 new 分配无限数量的指针?

如何确保 SubBlock6 将是 nullptr 或使用放置新的边界?

标签: c++new-operatorplacement-new

解决方案


为什么上面代码中的两个指针都有相同的地址?

Placement new 接受它将初始化正在创建的对象的确切地址。你通过相同的地址,你得到相同的地址。

这是否意味着即使我只有 100 个字节,我也可以通过放置 new 分配无限数量的指针?

不会。每个新展示位置都会重复使用存储空间。您当然可以无限次地重复使用存储空间,但您最多只能分配相同的 100 个字符。

如何确保 SubBlock6 将是 nullptr 或使用放置新的边界?

不可能。开始是为提供有效的存储空间来放置新对象以创建对象。如果不这样做,则行为未定义。

最后,您无需为新的安置而烦恼。

char *SubBlock1 = MainBlock;
char *SubBlock2 = MainBlock + 20;

对缓冲区进行分区就好了。只需确保delete[]仅将指针值存储在MainBlock.


推荐阅读