Обратите внимание, что malloc
не создает объекты, и поэтому вызов a1[i]=a2
является плохой формой.Вероятно, , кажется, работает нормально, поскольку они являются объектами POD-ish, но это не правильный способ сделать C ++.Это неопределенное поведение, которое совершенно непредсказуемо.Это может работать десять тысяч раз подряд, а затем стереть ваш банковский счет.Вместо этого вы должны использовать new
, который также создает.Или еще лучше, используйте вектор, как предлагают другие ответы.Кроме того, убедитесь, что конструктор по умолчанию инициализирует данные, и инициализация будет меньше беспокоить.
Если вы действительно должны использовать malloc, «правильный способ» инициализации таков:
std::uninitialized_copy(a1, a1+10, a2); //constructs and assigns
, что примерно эквивалентно:
{
int i=0;
try {
for(i=0; i<10; ++i)
new(a1+i)A(a2); //constructs and initializes in the buffer
} catch(...) {
try {
for(; i>=0; --i)
(a1+i)->~A(); //destroy if an error occured
} catch(...) {
std::terminate();
}
throw;
}
}