I think the "owner" of the hardpoint is the list in Components. Hardpointvoxel needs to keep either a shared or a normal pointer. If I use a unique ptr in the components it would need to use std::move as the parameter to set it would need to be a unique_ptr too. It doesn't hurt if both have share_ptr and I think the hardpointvoxel will probably loose it's pointer soon and only use the index which would make it independent from the worldobject.