Возможно ли на самом деле использовать размещение в переносном коде при использовании для массивов?Можно ли использовать новое место для массивов в переносном режиме?
Похоже, что указатель, который вы возвращаете из нового [], не всегда совпадает с адресом, который вы передаете (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, накладные расходы, по-видимому, различаются для разных классов. Например, если я удаляю виртуальный деструктор в примере, адрес, возвращенный из нового [], совпадает с адресом, который я передаю.
Ах проклятия.Я сделал обман вашего вопроса :([Размещение в массиве - новое требует неопределенных накладных расходов в буфере?] (Http://stackoverflow.com/questions/8720425/array-placement-new-requires-unspecified-overhead-in-the -buffer) – 2015-05-07 18:51:24
Хм ... если служебные данные исчезают, когда вы удаляете виртуальный деструктор, это говорит о том, что накладные расходы вероятны либо из класса vtable, либо из VSTudio в реализации RTTI. – 2016-05-25 18:33:02
Или, по крайней мере, часть накладные расходы. Также возможно, что служебные данные используются только в том случае, если класс имеет нетривиальный деструктор. – 2016-05-25 18:50:30