Boost logo

Boost Users :

Subject: [Boost-users] Memory leak in boost::filesystems::parent_path()?
From: B.W.H. van Beest (bwvb_at_[hidden])
Date: 2014-04-22 22:15:23


Hi,

The following minimal program (only 7 lines) causes valgrind to report 2
errors, in line6:

Some somebody point me to why it is wrong?

a.cpp:

    1 #include <boost/filesystem.hpp>
    2
    3 int main( int, char** )
    4 {
    5 boost::filesystem::path path0( "/a/b/c" );
    6 boost::filesystem::path path1 = path0.parent_path();
    7 }

Compiling and running with valgrind:

g++ -g -lboost_system -lboost_filesystem a.cpp -o a.exe

valgrind ./a.exe

This gives the following output. Note the errors.

==13303== Memcheck, a memory error detector
==13303== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==13303== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==13303== Command: ./a.exe
==13303==
==13303== Invalid read of size 8
==13303== at 0x5B0A5C8: wcscmp (in /lib64/libc-2.18.so)
==13303== by 0x52CA5C4: std::moneypunct<wchar_t,
false>::~moneypunct() (in /usr/lib64/libstdc++.so.6.0.18)
==13303== by 0x52CA638: std::moneypunct<wchar_t,
false>::~moneypunct() (in /usr/lib64/libstdc++.so.6.0.18)
==13303== by 0x52C1304: std::locale::_Impl::~_Impl() (in
/usr/lib64/libstdc++.so.6.0.18)
==13303== by 0x52C143C: std::locale::~locale() (in
/usr/lib64/libstdc++.so.6.0.18)
==13303== by 0x5AA775E: __cxa_finalize (in /lib64/libc-2.18.so)
==13303== by 0x503DD72: ??? (in /usr/lib64/libboost_filesystem.so.1.53.0)
==13303== by 0x400EE69: _dl_fini (in /lib64/ld-2.18.so)
==13303== by 0x5AA73D8: __run_exit_handlers (in /lib64/libc-2.18.so)
==13303== by 0x5AA7424: exit (in /lib64/libc-2.18.so)
==13303== by 0x5A90BEB: (below main) (in /lib64/libc-2.18.so)
==13303== Address 0x604c038 is 0 bytes after a block of size 8 alloc'd
==13303== at 0x4C284B7: operator new[](unsigned long) (in
/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==13303== by 0x52CBC81: std::moneypunct<wchar_t,
false>::_M_initialize_moneypunct(__locale_struct*, char const*) (in
/usr/lib64/libstdc++.so.6
.0.18)
==13303== by 0x52C3807: std::locale::_Impl::_Impl(char const*,
unsigned long) (in /usr/lib64/libstdc++.so.6.0.18)
==13303== by 0x52C42D1: std::locale::locale(char const*) (in
/usr/lib64/libstdc++.so.6.0.18)
==13303== by 0x50451B1: boost::filesystem::path::codecvt() (in
/usr/lib64/libboost_filesystem.so.1.53.0)
==13303== by 0x5046C7E: boost::filesystem::path::parent_path() const
(in /usr/lib64/libboost_filesystem.so.1.53.0)
==13303== by 0x401843: main (a.cpp:6)
==13303==
==13303== Invalid read of size 8
==13303== at 0x5B0A5C8: wcscmp (in /lib64/libc-2.18.so)
==13303== by 0x52CA4D4: std::moneypunct<wchar_t, true>::~moneypunct()
(in /usr/lib64/libstdc++.so.6.0.18)
==13303== by 0x52CA548: std::moneypunct<wchar_t, true>::~moneypunct()
(in /usr/lib64/libstdc++.so.6.0.18)
==13303== by 0x52C1304: std::locale::_Impl::~_Impl() (in
/usr/lib64/libstdc++.so.6.0.18)
==13303== by 0x52C143C: std::locale::~locale() (in
/usr/lib64/libstdc++.so.6.0.18)
==13303== by 0x5AA775E: __cxa_finalize (in /lib64/libc-2.18.so)
==13303== by 0x503DD72: ??? (in /usr/lib64/libboost_filesystem.so.1.53.0)
==13303== by 0x400EE69: _dl_fini (in /lib64/ld-2.18.so)
==13303== by 0x5AA73D8: __run_exit_handlers (in /lib64/libc-2.18.so)
==13303== by 0x5AA7424: exit (in /lib64/libc-2.18.so)
==13303== by 0x5A90BEB: (below main) (in /lib64/libc-2.18.so)
==13303== Address 0x604c268 is 0 bytes after a block of size 8 alloc'd
==13303== at 0x4C284B7: operator new[](unsigned long) (in
/usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==13303== by 0x52CB6B1: std::moneypunct<wchar_t,
true>::_M_initialize_moneypunct(__locale_struct*, char const*) (in
/usr/lib64/libstdc++.so.6.
0.18)
==13303== by 0x52C3854: std::locale::_Impl::_Impl(char const*,
unsigned long) (in /usr/lib64/libstdc++.so.6.0.18)
==13303== by 0x52C42D1: std::locale::locale(char const*) (in
/usr/lib64/libstdc++.so.6.0.18)
==13303== by 0x50451B1: boost::filesystem::path::codecvt() (in
/usr/lib64/libboost_filesystem.so.1.53.0)
==13303== by 0x5046C7E: boost::filesystem::path::parent_path() const
(in /usr/lib64/libboost_filesystem.so.1.53.0)
==13303== by 0x401843: main (a.cpp:6)
==13303==
==13303==
==13303== HEAP SUMMARY:
==13303== in use at exit: 0 bytes in 0 blocks
==13303== total heap usage: 483 allocs, 483 frees, 34,115 bytes allocated
==13303==
==13303== All heap blocks were freed -- no leaks are possible
==13303==
==13303== For counts of detected and suppressed errors, rerun with: -v
==13303== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 2 from 2)


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net