C ++放置新

时间:2012-11-13 23:53:00

标签: c++

很抱歉,如果这个问题听起来很愚蠢,但我刚刚开始学习C ++,并且有一些令我感到困惑的是关于新的展示位置

我一直在阅读C ++ Primer(我发现它是一本非常好的学习C ++的书),并且在放置新部分中给出了一个例子。该示例使用char数组为放置新

提供内存空间
const int BUF = 512;
const int N = 5;
char buffer[BUF];
double * pd1;
pd1 = new (buffer) double[N];

我的问题是为什么使用char数组为新的位置提供内存空间?上面代码中的最后一行是为double数组分配内存,当原始内存空间包含char数组时,这怎么可能?如果placement new正在使用char数组的内存空间,这是否意味着当我们分配double数组时它会覆盖该内存中的char数组?

再次抱歉,如果这个问题很奇怪,但希望我已经说清楚了。

5 个答案:

答案 0 :(得分:7)

  

为什么使用char数组为新的贴图提供内存空间?

为什么不呢? char是C ++定义的最小类型,几乎在每个实现中,它都是一个字节大小。因此,当您需要分配一定大小的内存块时,它就是一个很好的类型。

C ++还有关于如何分配char(和 char数组的非常具体的机制。例如,new char[*]将不会对齐char的对齐方式。它将与任何类型的最大正常对齐方式对齐。因此,您可以使用它来分配内存,然后在该内存中构造任何类型。

  

上面代码中的最后一行是为double数组分配内存,当原始内存空间包含char数组时,这怎么可能?

它没有分配任何东西。它是使用您提供的内存构建数组。这就是新的布局,它在所提供的内存中构造一个对象。

  

如果placement new正在使用char数组的内存空间,这是否意味着当我们分配double数组时它会覆盖该内存中的char数组?

答案 1 :(得分:3)

是的,char数组和double数组会重叠,更具体地说,它们将从内存中的同一地址开始,即(long)buffer(long)pd1将是相同的。我们可以通过使字节大小匹配(假设为sizeof(char) == 1)来强调重叠:

const int N = 5;
char buffer[N * sizeof(double)];
double *pd1 = new (buffer) double[N];

是的,如果您修改数据pd1指向,则指向的数据buffer也会被修改。反之亦然。 (另请参阅GCC标志-fstrict-aliasing以了解编译器优化如何与这种重叠一起工作。)

答案 2 :(得分:2)

没有愚蠢的问题。

它使用char可能是因为它让你考虑原始字节(char通常是1个字节长)。代码的最后一行不是分配内存,它只是在所提到的缓冲区上放置一个双数组。如果它是一个对象,它也会调用构造函数。是的,char数组被覆盖。

答案 3 :(得分:1)

记忆是记忆。机器不关心那里存储的数据类型,这取决于定义和实施的语言。 “为什么”的答案是“因为C ++旨在让你。”

答案 4 :(得分:0)

char buffer[BUF];只是一些记忆。字节组成缓冲区没有附加类型信息。只有编译器才知道,这个内存区域应该包含字符。你可以使用任何类型,甚至是双倍:

double buffer[BUF];
double *pd1 = new (buffer) double[N];