我正在使用以下代码列出一个目录:
for ( const auto& fileEntry : boost::make_iterator_range( boost::filesystem::directory_iterator( some_directory ), {} ) )
{
const boost::filesystem::path tmpFullName = fileEntry.path();
if ( boost::filesystem::exists( tmpFullName ) &&
boost::filesystem::is_regular_file( tmpFullName ) &&
(boost::filesystem::extension( tmpFullName ) == ".doc") )
{
processFile( tmpFullName.string() );
}
}
我曾零星看到如下错误
/boost/1.47.0/include/boost-1_47/boost/smart_ptr/shared_ptr.hpp: 420:T*boost::shared_ptr::操作员-
在我的代码中,我没有定义任何boostshared_ptr相反,我只使用std::unique_ptr。因此,我假设潜在的问题是上面的列表函数。
有人能仔细检查一下这个功能,看看这里是否有任何潜在的问题吗?
函数directory_iterator_increment()
(在操作. cpp
中)包含以下代码:
1940: if (temp_ec)
1941: {
1942: it.m_imp.reset();
1943: if (ec == 0)
1944: BOOST_FILESYSTEM_THROW(
1945: filesystem_error("boost::filesystem::directory_iterator::operator++",
1946: it.m_imp->dir_entry.path().parent_path(),
1947: error_code(BOOST_ERRNO, system_category())));
1948: ec->assign(BOOST_ERRNO, system_category());
1949: return;
1950: }
第1946行取消引用it。在第1942行重置后m_imp
。这将导致观察到的行为。
编辑以添加:
这在以后的版本中得到修复:https://svn.boost.org/trac/boost/ticket/5900
你用的是什么编译器?可能是您使用的c库版本与boost的不匹配。
Boost在目录迭代器内部使用shared_ptr
,因为"shared_ptr提供了InputIterators所需的浅拷贝语义学"(boost/files系统/操作. hpp,第924行,来自Boost v1.61)。在v1.61中,对于取消引用end
迭代器的情况有一个明确的断言,但也许v1.47只是依赖于shared_ptr
取消引用的断言。
我的猜测是迭代器在某个地方失效了。在这些情况下,目录有可能不存在吗?也许从另一个线程/进程对目录进行了更改?
BTW,v1.61包含开始()
/结束()
函数,用于在基于范围的for循环中启用directory_iterator
。也许在v1.47中没有,但如果是,我会指望它而不是显式使用make_iterator_range()
。