前几天我请求帮助从值中删除矢量值而不是它的索引,请参见此处的线程(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 ()
答案 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());