std::vector<Object> objects(n);
Поведение этого зависит от того, какую версию C ++ Standard реализует ваша реализация Стандартной библиотеки:
В C ++ 03 это создает одну конструкцию по умолчанию Object
, а затем копирует конструкции для этого объекта n раз.
В C ++ 0x эта конструкция по умолчанию n Object
s.
Разница обычно не имеет значения, но это хорошо знать.
std::vector<Object *> objects(n);
Это создает vector
с n null Object*
s. Поскольку Object*
не является типом класса и не имеет конструктора, вновь вставленные объекты инициализируются значением, что для указателей означает, что они установлены в NULL
.
Если вы хотите динамически создавать новые объекты и затем хранить указатели на них в контейнере, вам нужно вызвать new
самостоятельно. Обратите внимание, что вы не должны хранить необработанные указатели в стандартном контейнере библиотеки, если контейнер владеет указанными объектами. Это не исключение безопасно.
Вместо этого следует использовать интеллектуальный указатель, например shared_ptr
или unique_ptr
(примечание: интеллектуальный указатель auto_ptr
не может храниться в контейнерах из-за его необычной семантики копирования, поэтому shared_ptr
или unique_ptr
б).
В любом случае, чтобы вставить указатели на n различных динамически размещаемых объектов в контейнер, вам нужно вызвать new
n раз, чтобы создать эти n объектов. Нет ничего плохого в вашем for
петлевом решении.