我试过了:
....
vector<players*> player;
for (int i = 0; i<10; i++)
{
player.push_back(new players());
}
...
我想知道我是否需要为矢量释放内存?如果是这样,怎么样?
答案 0 :(得分:8)
如果你需要存储指向容器中的东西的指针,你应该存储某种智能指针(如std::tr1::shared_ptr
或boost::shared_ptr
)或使用一个用于存储指针的容器,就像找到的那样在Boost Pointer Container Library。
如果你确实存储了裸指针,你需要记住在容器被销毁之前删除容器中的指针。这包括抛出可能导致容器被销毁的异常的任何时间。考虑到前一段中提到的设施,实现这一目标是单调乏味,容易出错,并且完全没有必要。
答案 1 :(得分:3)
是的,你需要自己delete
。向量只会“破坏”指针(什么都不做)。
如果可以,请使用Boost pointer containers library,您无需担心。但是,如果你不能,你需要将容器包起来。考虑在填充容器的时间与其元素被删除的时间之间抛出异常。您将不执行元素删除代码并泄漏。
简单的包装器可能如下所示:
struct default_deleter
{
template <typename T>
void operator()(T* pPtr)
{
delete pPtr;
}
};
template <typename T, typename Deleter = default_deleter>
struct container_wrapper
{
typedef T container_type;
typedef Deleter deleter_type;
container_wrapper(container_type pContainer = container_type()) :
container(pContainer)
{}
~container_wrapper(void)
{
std::for_each(container.begin(), container.end(), deleter_type());
}
container_type container;
};
使用它像:
typedef std::vector<int*> vec_intptr;
typedef container_wrapper<vec_intptr> vec;
vec v;
v.container.push_back(new int); // and never worry about it again
这是一个简单的包装器。任何pop_back()
,erase()
等操作都会产生错误的效果。我强烈建议使用Boost。
可以考虑使用auto_ptr
的容器。相反,这是一个坏主意; auto_ptr
的复制语义阻止它工作。如果可能,最好的选择是摆脱动态分配。
答案 2 :(得分:2)
因为你正在创建新的玩家(),所以你必须删除它们。可能最好迭代矢量删除玩家,然后清理你的矢量。