您必须delete
在清除向量之前调用元素,或者在向量超出范围之前调用元素,前提是该向量拥有指向的对象。一个更优雅的解决方案是让向量保持智能指针。特定类型的智能指针应取决于所有权策略。例如,拥有指向对象的向量应使用 C++11 std::unique_ptr
:
std::vector<std::unique_ptr<Obstacle>> obstacles;
当然,以上所有这些都是假设您确实有充分的理由使用指针。通常最好的解决方案是最简单的:按价值持有物品:
std::vector<SomeType> things;
请注意,这不适用于您的情况,您要存储指向从基类派生的对象的指针,因为存储基类型的值会导致对象切片。
编辑:确保当向量超出范围时删除元素的一种简单方法是编写范围保护类:
template <typename CONTAINER>
struct PtrContainerGuard
{
PtrContainerGuard(CONTAINER& container) : c_(container) {}
~PtrContainerGuard()
{
for (typename CONTAINER::iterator it = c_.begin(); it != c_.end(); ++it)
delete (*it);
}
private:
CONTAINER& c_;
}
然后
std::vector<Obstacle*> obstacles;
PtrContainerGuard<std::vector::Obstacle*> p(obstacles);