我正在使用 boost/filesystem 来迭代目录并将它们添加到 MacOSX + XCode3 上的 Zip 文件中。
我原来的逻辑是这样的
path targetDir( "Volumes/data/some_directory" );
directory_iterator it( targetDir ), eod;
std::string filename;
std::string strPath;
// I tried both of two types of making loop
for( ; it != eod ; ++it )
{
path const& p = *it;
filename = p.filename();
if( is_directory(p) )
{
strPath = strDirectory + filename + string("/");
// Initially I wanted this logic to be recursive(these code block is a part of PackDirectory)
PackDirectory( archive, strPath, lpszPackFile );
}
else if( is_regular_file(p) )
{
strPath = strDirectory + filename;
// add this file to specified Zip file here
}
}
then function returns here.
返回此函数后会出现问题,特别是在调用 directory_iterator 的析构函数时,我猜。似乎它删除了无效指针,并接收 SIGABRT。程序有时会像下面那样崩溃,有时当我点击跳过时它会冻结,XCode 说“跳过”但是调用堆栈消失没有任何进展。关键是,即使我在循环内没有做任何事情,问题仍然存在,这意味着当变量被简单地创建并返回函数时。
有关更多信息,程序崩溃时的调用堆栈如下所示。
#0 0x93f86c5a in __kill
#1 0x93f86c4c in kill$UNIX2003
#2 0x940195a5 in raise
#3 0x9402f6e4 in abort
#4 0x93f2c575 in free
#5 0x00134aea in dir_itr_close [inlined] at v2_operations.cpp:1300
#6 0x00134aea in ~dir_itr_imp [inlined] at operations.hpp:877
#7 0x00134aea in checked_delete<boost::filesystem2::detail::dir_itr_imp<boost::filesystem2::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem2::path_traits> > > [inlined] at checked_delete.hpp:34
#8 0x00134aea in boost::detail::sp_counted_impl_p<boost::filesystem2::detail::dir_itr_imp<boost::filesystem2::basic_path<std::string, boost::filesystem2::path_traits> > >::dispose at v2_operations.cpp:78
#9 0x00136583 in boost::detail::sp_counted_base::weak_release at sp_counted_base_pt.hpp:97
它进入~dir_itr_imp,所以它似乎在通过类型检查后到达了正确的析构函数。
我对 directory_iterator 做错了吗?如果有人遇到这个问题,请告诉我。