在c ++中使用指针向量时可以泄露内存吗?

时间:2010-04-01 04:32:35

标签: c++ memory vector pointers memory-leaks

我试过了:

....
vector<players*> player;
for (int i = 0; i<10; i++)
{
    player.push_back(new players());
}
...

我想知道我是否需要为矢量释放内存?如果是这样,怎么样?

3 个答案:

答案 0 :(得分:8)

如果你需要存储指向容器中的东西的指针,你应该存储某种智能指针(如std::tr1::shared_ptrboost::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)

因为你正在创建新的玩家(),所以你必须删除它们。可能最好迭代矢量删除玩家,然后清理你的矢量。