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

C++ 从向量中删除值导致内存泄漏,c++,vector,memory-leaks,C++,Vector,Memory Leaks,几天前,我请求帮助按值而不是索引从向量中删除值,请参见此处的线程() 由于Angew的帮助,我能够得到一个要编译的解决方案,该解决方案在线程中被标记为“已回答” 然而,当使用此修复程序执行我的程序时,我的程序意外停止,并且当通过调试器运行它时,似乎修复程序导致了内存泄漏,有人能提供有关如何发生这种情况的见解吗 再一次,这里是我的结构,我使用它来查找我试图删除的值: struct IsUnderScore{ bool operator()(char c){ return c=='_'; }

几天前,我请求帮助按值而不是索引从向量中删除值,请参见此处的线程()

由于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 ()

此代码有一个潜在问题:

vector.erase(std::remove(vector.begin(), vector.end(), std::string("_")));
如果
std::remove
与任何元素都不匹配,它将返回
vector.end()
。擦除
end()
迭代器是未定义的行为,结果可能是SEGFULT

我认为您需要std::vector::erase的两个参数重载,因为它可以处理空范围。如果
std::remove
匹配多个元素,那么这也是正确的做法

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

你说的内存泄漏是什么意思?我没有在您的代码中看到任何新的
,这是内存泄漏的先决条件。这也让我感到困惑,我的代码中没有进行任何低级内存管理,但是当我实施上述修复时,我的程序编译了,但遇到此代码时停止,我用gdb检查了它,调试器抱怨内存泄漏。你能试着用valgrind运行它吗?看起来很奇怪。。。向量中有什么?内存泄漏或分段错误?A会很有用。啊,我明白了,所以似乎是试图删除end()迭代器导致了这个问题,以您的示例为例,代码按照规范编译和执行,感谢您的帮助,我以后会尽量记住这一点。@liquid:如果您检查一些,它应该说
end()
不能与单个参数一起使用
erase()