【问题标题】:Can memory be leaked when using vector of pointer in c++?在 C++ 中使用指针向量时会泄漏内存吗?
【发布时间】: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


    【解决方案1】:

    如果您需要在容器中存储指向事物的指针,您应该存储某种智能指针(如 std::tr1::shared_ptrboost::shared_ptr)或使用设计用于存储指针的容器,如在 @987654321 中找到的容器@。

    如果你确实存储了裸指针,你需要记住在容器被销毁之前删除容器中的指针。这包括任何时候抛出可能导致容器被破坏的异常。考虑到上一段中提到的设施,要做到这一点是乏味的、容易出错的,而且完全没有必要。

    【讨论】:

    • 值得一提的是C++0xunique_ptr 非常适合这种任务。与shared_ptr相比,开销要低得多。
    【解决方案2】:

    是的,您确实需要自己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 的复制语义阻止它工作。如果可能,最好的选择是摆脱动态分配。

    【讨论】:

    • 我不知道我们是否可以在向量中使用自动指针。 gotw.ca/publications/using_auto_ptr_effectively.htm
    • @Sammy,不能在 STL 容器中使用 auto_ptr可以使用 boost 指针容器库来做到这一点。
    • @GMan,最后一个container_wrapper 声明可能会产生误导;如果他决定打电话给v.container.erasev.container.clear 等,OP 仍然需要担心。
    • @Vlad:我同意,我会提到它。
    【解决方案3】:

    由于您正在创建新玩家(),您将不得不删除它们。可能最好迭代删除玩家的向量,然后清理你的向量。

    【讨论】:

      猜你喜欢
      • 2014-08-13
      • 2019-04-18
      • 2015-01-31
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 2012-09-08
      相关资源
      最近更新 更多