Рекомендуется ли использовать размещение new при построении POD-объекта из динамически создаваемого массива? - PullRequest
1 голос
/ 04 ноября 2011

Для любого типа POD рекомендуется сделать что-то подобное:

any_pod* p = new any_pod[n];
for (std::size_t i = 0; i < n; ++i)
    new (&p[i].member) other_pod(whatever);

Ответы [ 2 ]

1 голос
/ 04 ноября 2011

Учитывая, что вопрос слегка субъективен, нет, я бы никогда не порекомендовал подобный код.Независимо от того, является ли это неопределенным поведением или нет, его все еще трудно прочитать, и от любых будущих сопровождающих потребуется дополнительное время (возможно, значительное), чтобы понять, что вы делаете.

Если вынужна возможность типа переменной либо использовать boost::variant или boost::any в зависимости от ваших потребностей.

Если вы просто хотите взять данные из одного класса и скопировать / присвоить их другому, это то, что конвертирует конструкторы и конвертирует присваиваниеоператоры для.

0 голосов
/ 05 ноября 2011

Создавая поверх уже построенного объекта, вы нарушаете гарантии языка по уничтожению, поэтому я бы не стал этого делать, независимо от того, является ли объект POD.

Интересно, пытались ли вы спросить о чем-то немного ином:

any_pod* p = reinterpret_cast<any_pod*>(malloc(n * sizeof(any_pod[n]));
for (std::size_t i = 0; i < n; ++i)
  new (&p[i].member) other_pod(whatever);

В этом случае вы не восстанавливаете, а просто создаете блок необработанной памяти. В этом случае размещение нового целесообразно. (Хотя довольно редко вам приходится писать код, подобный этому. Это тот тип вещей, который вы можете сделать при реализации чего-то вроде std :: vector.) Вы должны быть очень осторожны, чтобы освободить массив позже, когда последний модуль имеет был разрушен.

...