【发布时间】:2010-04-01 04:32:35
【问题描述】:
我试过了:
....
vector<players*> player;
for (int i = 0; i<10; i++)
{
player.push_back(new players());
}
...
我想知道是否需要为向量释放内存?如果有,怎么做?
【问题讨论】:
标签: c++ memory vector pointers memory-leaks
我试过了:
....
vector<players*> player;
for (int i = 0; i<10; i++)
{
player.push_back(new players());
}
...
我想知道是否需要为向量释放内存?如果有,怎么做?
【问题讨论】:
标签: c++ memory vector pointers memory-leaks
如果您需要在容器中存储指向事物的指针,您应该存储某种智能指针(如 std::tr1::shared_ptr 或 boost::shared_ptr)或使用设计用于存储指针的容器,如在 @987654321 中找到的容器@。
如果你确实存储了裸指针,你需要记住在容器被销毁之前删除容器中的指针。这包括任何时候抛出可能导致容器被破坏的异常。考虑到上一段中提到的设施,要做到这一点是乏味的、容易出错的,而且完全没有必要。
【讨论】:
C++0x 与unique_ptr 非常适合这种任务。与shared_ptr相比,开销要低得多。
是的,您确实需要自己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 的复制语义阻止它工作。如果可能,最好的选择是摆脱动态分配。
【讨论】:
auto_ptr。 可以使用 boost 指针容器库来做到这一点。
container_wrapper 声明可能会产生误导;如果他决定打电话给v.container.erase、v.container.clear 等,OP 仍然需要担心。
由于您正在创建新玩家(),您将不得不删除它们。可能最好迭代删除玩家的向量,然后清理你的向量。
【讨论】: