使用Boost Coroutine(1.55)时不清楚分段错误?

时间:2015-01-18 02:58:58

标签: c++ c++11 boost move boost-coroutine

我写了一段代码,得到Segmentation fault。我不确定它是否是Boost Coroutine或我的代码的错误:

#include <string>
#include <functional>
#include <vector>
#include <fstream>
#include <boost/coroutine/coroutine.hpp>
using namespace std;

template <class T>
using C = boost::coroutines::coroutine<T()>;

string foo(C<string>::caller_type & yield,
           std::string fn, int cnt) {
  std::ifstream f(fn);
  // f.close();
  int local_cnt = 0;
  while(local_cnt < cnt) {
      string l;
      getline(f, l);
      local_cnt ++;
      yield(l);
  }
  f.close();
}

int main(int argc, char *argv[])
{
  vector<C<string> > result;
  for(int i = 0; i < 8192; ++i) {
    C<string> obj(bind(foo, std::placeholders::_1, "test.txt", 3)); // line I
    result.push_back(std::move(obj)); // line J
  }
  return 0;
}

test.txt非常大,因此在发生段错误之前永远不会得到eof。我使用了1.55的Boost并且有一些观察结果:

  1. line I
  2. 中发生了seg-error
  3. 如果我在yield子句之前删除或移动f.close(),则seg-error消失。
  4. 如果我在代码中删除line J,则seg-error消失。
  5. 如果我使用较小的数字代替8192(比如512),则seg-error消失。
  6. 这里的问题是什么?

1 个答案:

答案 0 :(得分:1)

&#34;太多打开的文件&#34; - 您超过了打开文件描述符的最大数量

  

如果我使用较小的数字代替8192(比如512),则seg-error消失。

seg fault将在ifstream内发生(不抛出) 检查ulimit -n cat / proc / sys / fs / file-max 的sysctl