テキストファイルから行を読み取り、トークン化する次の方法について考えてみます。
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 OSX10.8を使用しています。クラッシュが発生しないgcc-4.7を使用してSuSELinux12.2を試してみました。
編集:1つの推測は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;
}