Ниже мой тестовый класс: -
class Base
{
public:
int data;
Base(int x) : data(x) {}
};
Теперь я использую новое размещение для создания объектов в уже выделенной памяти: -
ДЕЛО 1:-
void* raw = operator new(4* sizeof(Base));
Base* b = static_cast<Base*>(raw);
for(int i = 0; i < 4; i++)
new (&b[i]) Base(i);
CASE_2:-
void* raw = operator new[](4* sizeof(Base)); <<<<<<<<<<<<<
Base* b = static_cast<Base*>(raw);
for(int i = 0; i < 4; i++)
new (&b[i]) Base(i);
В CASE_1 я использовал простое new
для выделения достаточного количества памяти, тогда как в Case_2 я использовал new[]
для этого выделения. Оба работают нормально, как я тестировал: -
for(int i = 0; i < 4; i++)
{
Base* b1 = b;
cout << (*(b1+i)).data;
}
Однако я не понимаю, является ли CASE_1 правильным способом выделения памяти для массива объектов. Оба эти подхода похожи.
std::vector
- person Mgetz   schedule 07.01.2015vector
. - person Mike Seymour   schedule 07.01.2015operator new
вместо использования оператораnew[]
, используя, например,int8_t
? Результат будет таким же, но менее запутанным для чтения. - person Some programmer dude   schedule 07.01.2015std::vector
с настраиваемым распределителем. - person Some programmer dude   schedule 07.01.2015int8_t
, как иint8_t* raw = new int8_t[4 * sizeof(Base)];
, просто выделяет часть байтов без какой-либо инициализации или построения. - person Some programmer dude   schedule 07.01.2015