如何避免C ++中的内存泄漏?

时间:2016-02-02 11:40:55

标签: c++

我对内存泄漏有疑问。可能是一个基本的。

map_a is an map of <int, vector<int>*>
ptr is an pointer to an vector of ints.

在for循环中,我在map_a中搜索'element'。如果未找到指针,则在map_a中创建一个新的向量/记录。

C ++伪代码:

map map_a;
for ( 1 to 10 ) {
  element = <int number come from a different algorithm, diff every time>;
  vector<int> *ptr = map_a[element];
  if (!ptr) {
    ptr = new vector<int>;
    map[element] = ptr;
  }
  ptr->push_back(i);
}

如何释放我们使用new分配的内存?我相信我们可能有其他方法来实现这种情况。但是如何采用这些代码呢?还有其他选择吗?

1 个答案:

答案 0 :(得分:0)

c ++中的任何指针都以相同的方式释放。因此,如果你有一个指向矢量的指针,你可以像这样调用delete:

vector<int> *a = new vector<int>();
delete a;

但是我认为,除了使用动态分配的向量之外,最有可能有更好的解决方案。

编辑:从您的问题来看,在周期之前地图是否为空是不明显的。如果是,您只需迭代它并为其每个值调用delete:

for (auto it = map_a.begin(); it != map_a.end(); ++it) {
  delete it->second.
}

但是如果地图不是空的,你需要一个辅助容器(比如一个向量)来存储在这个循环中分配的指针:

map map_a;
vector<vector<int> * > allocated;
for ( 1 to 10 ) {
  element = <int number come from a different algorithm, diff every time>;
  vector<int> *ptr = map_a[element];
  if (!ptr) {
    ptr = new vector<int>;
    allocated.push_back(ptr);
    map[element] = ptr;
  }
  ptr->push_back(i);
}

for (int i = 0; i < allocated.size(); ++i) {
   delete allocated[i];
}