C++ 函数boost::filesystem::valgrind将完成报告为可能的内存泄漏

C++ 函数boost::filesystem::valgrind将完成报告为可能的内存泄漏,c++,boost,C++,Boost,我有这样的代码 void Image::Init(std::string _filename) { boost::filesystem::path filepath(_filename); boost::filesystem::path realpath = boost::filesystem::complete(filepath); //leak point ... } 出于某种原因,valgrind报告说,带有上述评论的线路正在泄漏。 这是一份可能丢失的报告。 尽管如此,我还

我有这样的代码

void Image::Init(std::string _filename)
{
  boost::filesystem::path filepath(_filename);
  boost::filesystem::path realpath = boost::filesystem::complete(filepath);  //leak point
  ...
}
出于某种原因,valgrind报告说,带有上述评论的线路正在泄漏。 这是一份可能丢失的报告。 尽管如此,我还是想弄清楚为什么它可能会丢失。 我使用的是boost 1.38版。瓦尔格林3.7。我的操作系统是linux 2.6.29

valgrind输出如下所示:

==32009== 471 bytes in 3 blocks are possibly lost in loss record 161 of 174
==32009==    at 0x40220EE: malloc (vg_replace_malloc.c:263)
==32009==    by 0x84DAC61: operator new(unsigned int) (ZeroNew.cpp:11)
==32009==    by 0x44C79DA: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.8)
==32009==    by 0x44C8947: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/libstdc++.so.6.0.8)
==32009==    by 0x44CA3A7: std::string::reserve(unsigned int) (in /usr/lib/libstdc++.so.6.0.8)
==32009==    by 0x44CA9E3: std::string::operator+=(char) (in /usr/lib/libstdc++.so.6.0.8)
==32009==    by 0x829189A: boost::filesystem::basic_path<std::string, boost::filesystem::path_traits>::m_append(char) (path.hpp:1079)
==32009==    by 0x829193C: boost::filesystem::basic_path<std::string, boost::filesystem::path_traits>::operator/=(char const*) (path.hpp:1099)
==32009==    by 0x8291977: boost::filesystem::basic_path<std::string, boost::filesystem::path_traits>::operator/=(boost::filesystem::basic_path<std::string, boost::filesystem::path_traits> const&) (path.hpp:203)
==32009==    by 0x8296F24: boost::filesystem::basic_path<std::string, boost::filesystem::path_traits> boost::filesystem::operator/<std::string, boost::filesystem::path_traits>(boost::filesystem::basic_path<std::string, boost::filesystem::path_traits> const&, boost::filesystem::basic_path<std::string, boost::filesystem::path_traits> const&) (path.hpp:521)
==32009==    by 0x829AB20: boost::enable_if<boost::filesystem::is_basic_path<boost::filesystem::basic_path<std::string, boost::filesystem::path_traits> >, boost::filesystem::basic_path<std::string, boost::filesystem::path_traits> >::type boost::filesystem::complete<boost::filesystem::basic_path<std::string, boost::filesystem::path_traits> >(boost::filesystem::basic_path<std::string, boost::filesystem::path_traits> const&, boost::filesystem::basic_path<std::string, boost::filesystem::path_traits> const&) (operations.hpp:586)
==32009==    by 0x829C41E: boost::filesystem::complete(boost::filesystem::basic_path<std::string, boost::filesystem::path_traits> const&) (operations.hpp:752)
==32009==    by 0x849AF2D: Image::Init(std::string, int) (Image.cpp:50)
我很好奇是否有人知道为什么会发生这种情况,或者boost版本1.38中的代码中是否有bug。如果可以使用稍微不同的语法进行变通,那就太棒了


谢谢。

值得一提的是,您是否尝试过使用更新版本的boost?1.38已经过时了,1.49是最新版本。特别是boost::filesystem已经从1.44版开始完全重写。例程boost::filesystem::complete已被boost::filesystem::absolute取代。我已经用boost 1.49和absolute测试了你的代码片段,没有发现任何可能的漏洞。我建议你下载boost源代码,用你需要的库编译它,至少在你的情况下是系统和文件系统,并将它安装在你的主目录中的某个地方,例如~/usr,这样你就可以测试这个问题是否对你来说也消失了..哦,相信我,当我说我非常想升级到boost 1.49时,但不幸的是,我在这方面受到限制,因为我认为这些理由很愚蠢,但不幸的是,在这个时候,这些理由是不可改变的。如果我使用1.49,我毫不怀疑这个问题会像您所说的那样消失,但这并不会改变我被迫使用1.49构建和部署的内容。是的,这很糟糕,但我希望可能有其他一些语法解决方法,我可以使用,这将使它干净地工作。开始认为这可能与valgrind不喜欢STL分配器或其他东西有关,正如我在boost::posix_time::microsec_clock::local_time上执行std out的流操作时不时看到的一样;我尝试了GLIBXX_FORCE_新的环境变量,但这并没有实现蹲起。很可能是valgrind特异性假阳性。