如何使用带有STL容器的C ++避免内存泄漏?

时间:2015-04-04 16:16:14

标签: c++ pointers memory-leaks

下面的代码段:

//container declared
map<string, structA*>& aMap;

// allocation and insertion to container
structA *item = new structA();
aMap["arrDevAddr"] = item;

但是,我迭代并释放地图末尾的地图值(指针)。

现在,由于上面的代码片段,valgrind将我标记为“绝对泄露”的消息。

我想澄清一下编码的一般原则,以避免内存泄漏。根据我的理解,在(C ++编码):

  1. 当我们分配一个内存时,我们有权释放它,并受到整个代码范围的限制。
  2. 当我们将分配的内存保留在某个容器中时(例如map here),我们仍然需要保留这些指针(分配),直到地图使用这些指针。
  3. 表示分配&gt;&gt;添加指向容器的指针&gt;&gt;地图中指针的使用&gt;&gt;确保“删除/释放”结构指针,当地图使用结束时,或者如果地图包含在某个对象中,那么在对象的“析构函数”中,应该迭代地图并释放结构指针。
  4. 如果我理解错了,请纠正我。

    第二种情况:

    class A{
    ...
    map<string, structA*>& aMap;
    ...
    }
    

    现在在其他一些类中,插入的地图值为;

     if(..)
    { structA item;
         aObj->aMap["arrDevAddr"] = &item;
    }
    ...
    

    现在,在这种情况下,由于“item”是范围的本地,地图是否会包含“悬空引用”?如果没有,怎么样? 在这种情况下应该采用什么方式来确保,我们在编码时避免任何内存泄漏?

2 个答案:

答案 0 :(得分:3)

自己不要deletefree。总是使用内存管理类 - 除非你非常努力地做一些非常愚蠢的事情,否则它们完全不受内存泄漏和相关问题的影响。

在这种情况下,unique_ptr之类的内容会很好,甚至只是按值存储structA

答案 1 :(得分:0)

您可以通过存储std :: unique_ptr而不是原始指针来避免内存泄漏:

#include <iostream>
#include <map>
#include <memory>
#include <string>

struct structA {};
using structA_ptr = std::unique_ptr<structA>;

//container declared
std::map<std::string, structA_ptr> aMap;


using namespace std;

int main()
{
    aMap.emplace("bob", structA_ptr { new structA {} });

   return 0;
}