I wouldn't make a vector of unique pointers to objects at all (it will A: be harder, B: a double indirection). A vector will already do all the memory managment for you. Live demo here : https://onlinegdb.com/SeLMTl2Zz
#include <iostream>
#include <memory>
#include <vector>
//-----------------------------------------------------------------------------
// (Fahrzeug, but then in English)
class Vehicle
{
public:
// give each vehicle a unique instance number
Vehicle() :
m_id{ ++s_id }
{
std::cout << "Constructed vehicle : " << m_id << "\n";
}
// show when object is destructed (and why unique_ptr is not needed)
~Vehicle()
{
std::cout << "Destructed vehicle : " << m_id << "\n";
}
std::size_t get_id() const
{
return m_id;
}
private:
static std::size_t s_id;
std::size_t m_id;
};
//-----------------------------------------------------------------------------
// initialize id generating number
std::size_t Vehicle::s_id{ 0ul };
// don't use magic numbers in code, give your constants names
const std::size_t number_of_vehicles = 3ul;
//-----------------------------------------------------------------------------
int main()
{
// create a scope to manage lifecycle of the vector of vehicles
// so I can show the destruction phase more clearly
{
// you can initialize vectors from the constructor
std::cout << "Creating vector with vehicles\n";
std::vector<Vehicle> vehicles(number_of_vehicles);
for (const auto& vehicle : vehicles)
{
std::cout << vehicle.get_id() << "\n";
}
std::cout << "Destructing vector with vehicles\n";
}
return 0;
}
std::vector<std::unique_ptr<Fahrzeug>> FZ;should be ouside the loop.std::moveis useless instd::move(std::make_unique<Fahrzeug>()). (it might be needed forstd::move(FZ[i])though).