2

我正在使用 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 做错了吗?如果有人遇到这个问题,请告诉我。

4

1 回答 1

0

引发的信号free不一定指向调用函数中的缺陷。较早且中断的调用free可能已损坏malloc的可用内存列表,从而导致错误。

尝试在 中运行你的程序valgrind,它更健壮,并且在使用损坏的内存分配/释放时会立即死亡。如果valgrind不是一个选项,您还可以尝试在独立于程序其余部分的单元测试中测试您的代码。

于 2012-07-08T21:56:49.400 回答