【发布时间】:2016-11-09 10:03:39
【问题描述】:
我正在编写一个小程序来处理一个大文本文件并进行一些替换。问题是它永远不会停止分配新内存,所以最终它会耗尽内存。我已经将它简化为一个简单的程序,它只计算行数(参见下面的代码),同时仍然分配越来越多的内存。我必须承认,我对提升和提升精神知之甚少。你能告诉我我做错了什么吗?谢谢一百万!
#include <string>
#include <iostream>
#include <boost/spirit/include/lex_lexertl.hpp>
#include <boost/bind.hpp>
#include <boost/ref.hpp>
#include <boost/spirit/include/support_istream_iterator.hpp>
// Token ids
enum token_ids {
ID_EOL= 100
};
// Token definition
template <typename Lexer>
struct var_replace_tokens : boost::spirit::lex::lexer<Lexer> {
var_replace_tokens() {
this->self.add ("\n", ID_EOL); // newline characters
}
};
// Functor
struct replacer {
typedef bool result_type;
template <typename Token>
bool operator()(Token const& t, std::size_t& lines) const {
switch (t.id()) {
case ID_EOL:
lines++;
break;
}
return true;
}
};
int main(int argc, char **argv) {
size_t lines=0;
var_replace_tokens< boost::spirit::lex::lexertl::lexer< boost::spirit::lex::lexertl::token< boost::spirit::istream_iterator> > > var_replace_functor;
cin.unsetf(std::ios::skipws);
boost::spirit::istream_iterator first(cin);
boost::spirit::istream_iterator last;
bool r = boost::spirit::lex::tokenize(first, last, var_replace_functor, boost::bind(replacer(), _1, boost::ref(lines)));
if (r) {
cerr<<"Lines processed: "<<lines<<endl;
} else {
string rest(first, last);
cerr << "Processing failed at: "<<rest<<" (line "<<lines<<")"<<endl;
}
}
【问题讨论】:
-
文件有多大/有多少行?
-
可能你没有内存泄漏。可能输入文本文件太大而无法放入内存。
-
它必须是multi_pass迭代器适配器。由于没有语法精神不知道什么时候可以刷。有时间我看看这个
-
文件大小为 7 GB。
-
据我所知,istream_iterator 负责读取输入流,而无需将整个流存储到内存中。实际上,程序从一开始就开始输出东西(不是这个,原来的)。
标签: c++ boost memory-leaks boost-spirit