【问题标题】:C++ directory_iteratorC++ 目录迭代器
【发布时间】:2013-04-11 17:56:41
【问题描述】:

自从我使用 C++ 以来已经有一段时间了,请原谅我的新手问题。

我编写了以下代码来获取目录内容的列表,它工作正常:

for (directory_iterator end, dir("./");
     dir != end; dir++) {
    std::cout << *dir << std::endl;
}

“*dir”返回什么,一个“char数组”指针,一个指向“string”对象的指针,还是一个指向“path”对象的指针?

我想将“*dir”(如果它以 .cpp 结尾)传递给另一个函数(),它将在稍后(异步)作用于它。我想我需要复制“*dir”。我写了以下代码:

path *_path;
for (directory_iterator end, dir("./");
     dir != end; dir++) {
    _path = new path(*dir);
    if (_path->extension() == ".cpp") {
        function1(_path);    // function1() will free _path
    } else
        free(_path);
}

谢谢你, 艾哈迈德。

【问题讨论】:

  • 根据this它返回一个directory_entry。
  • 酷,有道理(对我来说)。我查看了“类路径”的定义(boost.org/doc/libs/1_53_0/libs/filesystem/doc/…)有人可以指出用于创建“_path”的构造函数。我的意思是,“类路径”的哪个构造函数采用“directory_entry”。

标签: c++ boost boost-filesystem


【解决方案1】:

来自documentation of boost::directory_iterator

未定义结束迭代器上 operator* 的结果。对于任何 其他迭代器值一个 const directory_entry& 被返回。

关于函数调用,我认为最简单的方法是:

using namespace boost::filesystem;

for (directory_iterator end, dir("./"); dir != end; dir++) {
  const boost::filesystem::path &this_path = dir->path();
  if (this_path.extension() == ".cpp") {
    function1(this_path); // Nothing to free
  } 
}

其中function1方法可以声明为:

void function1(const boost::filesystem::path this_path);

【讨论】:

  • 非常感谢。在您的代码中,究竟传递给 function1() 的是什么,指向类型为“path”或“object path”的对象,在这种情况下 function1() 将复制到堆栈上?
    我问的原因是,如果将指向“路径”的指针发送到 function1(),那么一旦 for 循环完成,该指针(对象)会无效吗?
  • 我在您发表评论之前更新了答案。如果参数是“boost::filesystem::path this_path”,则执行对象的副本。
  • 假设在大多数情况下我们不知道(或不关心)对象的大小,将对象作为参数而不是指向它的指针传递是否有效?我问的是一般的编程风格。
  • 我认为这取决于您如何使用函数内部的对象。就个人而言,我不喜欢在一种方法中分配对象并在另一种方法中释放它。在这种情况下,第一个路径对象可以是引用,因此只创建一个副本。
  • Callja:我完全同意你的看法,关于在一个函数中分配(在我的例子中是线程)并在另一个函数中释放(线程)。以下是我的代码流程,这可能对我的逻辑有所启发:(1) func1() 找到具有某些属性的文件,将其放入队列中。另一个函数(线程)从队列中获取此路径并处理文件。我认为有效的方法是在 function1() 中分配一个路径,将 int 放入队列中, function2() 将其拾取,然后将其释放。
猜你喜欢
  • 2012-11-06
  • 1970-01-01
  • 2013-12-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多