将其用于数组时,是否可以实际利用可移植代码中的新放置?
从new []返回的指针似乎并不总是与您传递的地址相同(5.3.4,标准中的注12似乎确认这是正确的),但我看不出您如何在这种情况下,可以为数组分配一个缓冲区。
以下示例显示了该问题。与Visual Studio一起编译,此示例导致内存损坏:
#include <new>
#include <stdio.h>
class A
{
public:
A() : data(0) {}
virtual ~A() {}
int data;
};
int main()
{
const int NUMELEMENTS=20;
char *pBuffer = new char[NUMELEMENTS*sizeof(A)];
A *pA = new(pBuffer) A[NUMELEMENTS];
// With VC++, pA will be four bytes higher than pBuffer
printf("Buffer address: %x, Array address: %x\n", pBuffer, pA);
// Debug runtime will assert here due to heap corruption
delete[] pBuffer;
return 0;
}
看着内存,编译器似乎正在使用缓冲区的前四个字节来存储其中的项目数计数。这意味着,由于缓冲区仅sizeof(A)*NUMELEMENTS大,因此数组中的最后一个元素将写入未分配的堆中。
因此,问题是您能找出为了安全地使用位置new []而实现需要多少额外开销?理想情况下,我需要一种可在不同编译器之间移植的技术。请注意,至少在VC的情况下,不同类的开销似乎有所不同。例如,如果我在示例中删除了虚拟析构函数,则new []返回的地址与我传入的地址相同。
互换的青春
慕勒3428872
千万里不及你
相关分类