Valgrind抱怨一个substr调用。
string Message::nextField(string& input) {
int posSeparator = input.find_first_of(SEPARATOR);
string temp;
temp = input.substr(0, posSeparator); //Error points to this line
input.erase(0, posSeparator + 1);
return temp;
}
错误如下:
12个块中的290个字节肯定在1的丢失记录1中丢失
该函数的作用基本上是解析输入,返回由SEPARATOR字符分隔的字符串部分。使用下一个定义从另一个类的方法调用此函数:
void doSomething(string input) {
input.erase(0,2);
string temp = nextField(input);
this->room = atoi(temp.c_str());
temp = input;
this->money = atoi(temp.c_str());
}
没有别的奇怪或重要的东西可以包含在这里。 我使用Eclipse Indigo的Valgrind分析中的Valgrind的默认设置。 有什么想法吗?
答案 0 :(得分:2)
这可能不是您代码中的错误。由于C ++标准库的实现细节,可能会报告此错误。要验证此操作,请尝试Valgrind FAQ中的以下内容:
使用GCC 2.91,2.95,3.0和3.1,使用STL编译所有源 使用-D__USE_MALLOC。谨防!这是从GCC开始删除的 版本3.3。
使用GCC 3.2.2及更高版本,您应该导出环境变量 运行程序前的GLIBCPP_FORCE_NEW。
使用GCC 3.4及更高版本,该变量已将名称更改为 GLIBCXX_FORCE_NEW。
答案 1 :(得分:1)
您的来源中的其他位置可能有错误。我尝试使用以下代码复制错误:
#include <string>
#include <iostream>
#include <cstdlib>
using namespace std;
const char SEPARATOR = ':';
struct Foo
{
public:
int room;
int money;
void doSomething(string input) {
input.erase(0,2);
string temp = nextField(input);
this->room = atoi(temp.c_str());
temp = input;
this->money = atoi(temp.c_str());
}
string nextField(string& input) {
int posSeparator = input.find_first_of(SEPARATOR);
string temp;
temp = input.substr(0, posSeparator); //Error points to this line
input.erase(0, posSeparator + 1);
return temp;
}
};
int main()
{
Foo f;
f.doSomething("--234:12");
std::cout << f.room << " - " << f.money << std::endl;
}
然后跑了valgrind:
valgrind --tool=memcheck <executable>
,输出结果为:
HEAP SUMMARY:
in use at exit: 0 bytes in 0 blocks
total heap usage: 2 allocs, 2 frees, 61 bytes allocated
All heap blocks were freed -- no leaks are possible
For counts of detected and suppressed errors, rerun with: -v
ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)
所以,可能你的问题不在这段代码中
答案 2 :(得分:0)
您不检查posSeparator是否与string :: npos实际不同 - 这可能会导致擦除问题。这是一个疯狂的镜头,但无论如何它可能会修复一个bug。