提问者:小点点

助推::f小体3::de::dir_itr_imp在助推::shared_ptr意义


我正在使用以下代码列出一个目录:

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。因此,我假设潜在的问题是上面的列表函数。

有人能仔细检查一下这个功能,看看这里是否有任何潜在的问题吗?


共3个答案

匿名用户

函数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()