【问题标题】:Memory management and C++ container classes内存管理和 C++ 容器类
【发布时间】:2012-03-19 21:05:07
【问题描述】:

我在使用 C++ 中的标准容器类(列表、地图等)时遇到了一些问题。问题似乎与移除容器的物品有关。我试图在容器中存储指向对象的指针,然后当我想从容器中删除项目时,我使用eraseremove。当我这样做时,容器是否实际上删除了容器中的对象,或者只是从容器中删除了指针?

我希望它只是删除指针,因为我正在使用容器对对象进行分组,并且对象可能在多个组中,所以我不希望它在被删除时被删除来自容器!

谢谢!

【问题讨论】:

  • 您可以通过在项目的析构函数中放入一些调试代码来检查自己,例如std::cout 语句。无论如何,“一些麻烦”究竟包括什么?
  • 感谢析构函数提示。很难找出问题所在,但最终与解释损坏的 UDP 消息和随机崩溃有关,而不是内存管理问题!只是想确保我正确理解了 C++ 容器类。谢谢!

标签: c++ list map containers std


【解决方案1】:

当我这样做时,容器实际上是删除容器中的对象,还是只是从容器中删除指针?

后者。

...所以我不希望它在从容器中删除时被删除!

这实际上是发生的事情,但我仍然想指出std::shared_ptr,它可以使指针/容器交互变得更加容易。

【讨论】:

    【解决方案2】:

    当我这样做时,容器是否实际上删除了容器中的对象,或者只是从容器中删除了指针?

    标准库容器不负责释放指针元素的动态内存。如果您在容器中存储原始指针,您将不得不自己处理释放动态内存。

    这就是 C++ 中 RAII 概念的强大之处。您可以使用 Smart pointer 代替容器内的原始指针,一旦这样做,释放将由智能指针隐式处理,而不是显式处理内存管理的开销。

    有许多可用的智能指针,我故意克制自己不建议使用特定的智能指针,因为它具体取决于所涉及对象的所有权和生命周期。检查链接并根据您的选择合适的智能指针要求。

    【讨论】:

      【解决方案3】:

      编译器不会删除放在堆内存中的对象

      【讨论】:

        【解决方案4】:

        Scott Meyer 的 Effective STL 将为您提供有关在容器类中存储原始指针的答案。

        如果你不想使用 smart_pointers 或其他类似的东西,而是存储原始指针,如果你想清除相关的内存,你必须显式删除它。

        分配时,例如一个 std::vector 然后在清除它之前,你必须手动删除它的每个元素。

        std::vector<int*> v(10;
        for (int i=0; i<10; i++)
           v.at(i) = new int;
        

        走错路

        v.clear(); // !!! MEMORY LEAK 
        

        正确的方法是

        for (int i=0; i<10; i++)
            delete v.at(i);
        

        然后

        v.clear();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-05
          • 1970-01-01
          • 1970-01-01
          • 2012-02-27
          • 2013-05-17
          • 2020-10-10
          • 2020-11-02
          • 2021-11-01
          相关资源
          最近更新 更多