我是C++的新手,对内存管理有疑问.
在标题中,我有这个:
std::vector<Obstacle::Obstacle*> obstacles;
Run Code Online (Sandbox Code Playgroud)
在.cpp我这样做:
Circle *circle = new Circle(x, y, radius);
obstacles.push_back(circle);
Run Code Online (Sandbox Code Playgroud)
where Circle是的子类Obstacle.
我的问题是我什么时候应该调用delete向量中的元素?我听说每个人new应该平衡一个delete.我是否需要在析构函数循环中通过向量并调用delete每个元素?是不是有更优雅的方式?
谢谢
jua*_*nza 10
delete在清除向量之前,或者在向量超出范围之前,如果向量拥有指向的对象,则必须调用元素.更优雅的解决方案是让矢量保持智能指针.特定类型的智能指针应取决于所有权策略.例如,拥有指向对象的向量应该使用C++ 11 std::unique_ptr:
std::vector<std::unique_ptr<Obstacle>> obstacles;
Run Code Online (Sandbox Code Playgroud)
当然,以上所有都假设您实际上有充分的理由使用指针.通常最好的解决方案是最简单的解决方案:按值保存项目:
std::vector<SomeType> things;
Run Code Online (Sandbox Code Playgroud)
请注意,这不适用于您存储指向从基类派生的对象的指针的情况,因为存储基类型的值将导致对象切片.
编辑:当向量超出范围时,确保删除元素的一种简单方法是编写范围保护类:
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_;
}
Run Code Online (Sandbox Code Playgroud)
然后
std::vector<Obstacle*> obstacles;
PtrContainerGuard<std::vector::Obstacle*> p(obstacles);
Run Code Online (Sandbox Code Playgroud)