从向量中删除值导致的内存泄漏

时间:2014-04-28 13:33:43

标签: c++ vector memory-leaks

前几天我请求帮助从值中删除矢量值而不是它的索引,请参见此处的线程(How to overload '==' operator within a struct?

由于Angew的帮助,我能够获得编译解决方案,解决方案在线程中标记为“已回答”。

然而,当使用此修复程序执行我的程序时,我的程序意外停止,并且当通过调试器运行时,似乎该修复程序导致内存泄漏,任何人都可以提供有关如何发生这种情况的见解吗?

再一次,这是我用来查找我想要删除的值的结构:

struct IsUnderScore{
bool operator()(char c){
    return c=='_';
}
};

我可以很容易地使用擦除删除习语在字符串上使用它:

string.erase(remove_if(string.begin(), string.end(), IsUnderScore()), string.end());

但是当在向量上使用它时,我遇到了编译问题,如下所示:

vector.erase(std::remove(vector.begin(), vector.end(), std::string("_")));

现在我得到了内存泄漏。

编辑:这是gdb给出的错误的副本。

Program received signal SIGSEGV, Segmentation fault.
0x00002aaaab917ee8 in std::string::_Rep::_M_is_leaked ()

1 个答案:

答案 0 :(得分:2)

此代码存在潜在问题:

vector.erase(std::remove(vector.begin(), vector.end(), std::string("_")));

如果std::remove与任何元素匹配,则返回vector.end()。擦除end()迭代器是未定义的行为,可能会产生段错误。

我认为你想要std::vector::erase的双参数重载,因为它可以处理空范围。如果std::remove匹配多个元素......

,这也是正确的做法
vector.erase(std::remove(vector.begin(), vector.end(), std::string("_")), vector.end());