考虑以下从文本文件中读取一行并将其标记化的方法:
std::pair<int, int> METISParser::getHeader() {
// handle header line
int n; // number of nodes
int m; // number of edges
std::string line = "";
assert (this->graphFile);
if (std::getline(this->graphFile, line)) {
std::vector<node> tokens = parseLine(line);
n = tokens[0];
m = tokens[1];
return std::make_pair(n, m);
} else {
ERROR("getline not successful");
}
}
崩溃发生在std::getline
(pointer being freed was not allocated
- 不会在这里详细介绍)。如果我在其他系统上编译我的代码并且很可能不是我自己的代码中的错误,则不会发生崩溃。目前我无法解决这个问题,而且我没有时间,所以我会在你的帮助下尝试绕过它:
你能建议一个不使用的替代实现std::getline
吗?
编辑:我在带有 gcc-4.7.2 的 Mac OS X 10.8 上。我使用 gcc-4.7 在 SuSE Linux 12.2 上进行了尝试,没有发生崩溃。
编辑:一个猜测是parseLine
破坏了字符串。这是完整性的代码:
static std::vector<node> parseLine(std::string line) {
std::stringstream stream(line);
std::string token;
char delim = ' ';
std::vector<node> adjacencies;
// split string and push adjacent nodes
while (std::getline(stream, token, delim)) {
node v = atoi(token.c_str());
adjacencies.push_back(v);
}
return adjacencies;
}