为什么两个指针都有相同的内存地址

Why do both pointers have the same memory address?

本文关键字:地址 内存 指针 两个 为什么      更新时间:2023-10-16
#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在SubBlock1之后是20字节。

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

如何使用placementnew确保SubBlock6是nullptr或越界?

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

Placementnew接受它将初始化正在创建的对象的确切地址。你传递相同的地址,你得到相同的地址。

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

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

如何使用placementnew确保SubBlock6是nullptr或越界?

没有办法。开始于为新放置提供有效存储以创建对象。如果不这样做,则行为是未定义的。

最后,你不需要为新的职位而烦恼。

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

分区缓冲区很好。只需确保对delete[]只存储在MainBlock中的指针值。

(MainBlock)参数是放置参数。实际上,您明确地告诉程序在MainBlock的地址分配SubBlock1SubBlock2

为了获得构造对象的地址,每个new表达式都会调用相应的分配函数。一旦完成了分配并从分配函数返回了地址,它就会尝试在指定的地址处构造对象。

给定char* SubBlock1 = new (MainBlock) char[20];,它调用以下分配函数:

void* operator new[]( std::size_t count, void* ptr );

由标准数组表单放置新表达式调用。标准库实现不执行任何操作,并返回未修改的ptr。

正如上面的文档所说,调用这个分配函数什么都不做,只会返回未经修改传递的地址。因此,这个新的表达正好在MainBlock上构建了20个char。这就是为什么SubBlock1SubBlock2的地址相同的原因。


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

否。请注意,分配构造是两件不同的事情。在您的示例中,只分配一次内存,并在上面构造多次对象。因此,在分配的内存上构造的对象的布局取决于您。