Boost 1.65.1 translate模块内存泄漏问题排查与解决咨询
Boost Locale内存泄漏问题咨询
我用Valgrind分析了一段调用Boost Locale翻译功能的简单程序,检测到存在1376字节的可能丢失内存块及67954字节的仍可访问内存块。现咨询该内存泄漏产生的原因,以及如何在程序退出前清理这些内存。
程序代码
int main(int argc, char **argv) { generator gen; gen.add_messages_path("."); gen.add_messages_domain("hello"); locale::global(gen("de_DE.UTF-8")); cout.imbue(locale()); cout << translate("Hello World") << endl; }
Valgrind检测结果
泄漏摘要
LEAK SUMMARY: ==8895== definitely lost: 0 bytes in 0 blocks ==8895== indirectly lost: 0 bytes in 0 blocks ==8895== possibly lost: 1,376 bytes in 4 blocks ==8895== still reachable: 67,954 bytes in 253 blocks ==8895== of which reachable via heuristic: ==8895== newarray : 14,440 bytes in 29 blocks
部分泄漏详情
==8895== 1,376 bytes in 4 blocks are possibly lost in loss record 202 of 212 ==8895== at 0x4C31B0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==8895== by 0x643D6B6: icu_60::UnicodeString::allocate(int) (in /usr/lib/x86_64-linux-gnu/libicuuc.so.60.2) ==8895== by 0x643F3A8: icu_60::UnicodeString::cloneArrayIfNeeded(int, int, signed char, int**, signed char) (in /usr/lib/x86_64-linux-gnu/libicuuc.so.60.2) ==8895== by 0x643F940: icu_60::UnicodeString::doAppend(char16_t const*, int, int) (in /usr/lib/x86_64-linux-gnu/libicuuc.so.60.2) ==8895== by 0x64AD66D: icu_60::SimpleFormatter::format(char16_t const*, int, icu_60::UnicodeString const* const*, icu_60::UnicodeString&, icu_60::UnicodeString const*, signed char, int*, int, UErrorCode&) (in /usr/lib/x86_64-linux-gnu/libicuuc.so.60.2) ==8895== by 0x64AD83B: icu_60::SimpleFormatter::formatAndAppend(icu_60::UnicodeString const* const*, int, icu_60::UnicodeString&, int*, int, UErrorCode&) const (in /usr/lib/x86_64-linux-gnu/libicuuc.so.60.2) ==8895== by 0x64AD915: icu_60::SimpleFormatter::format(icu_60::UnicodeString const&, icu_60::UnicodeString const&, icu_60::UnicodeString&, UErrorCode&) const (in /usr/lib/x86_64-linux-gnu/libicuuc.so.60.2) ==8895== by 0x5FD629E: icu_60::SimpleDateFormat::construct(icu_60::DateFormat::EStyle, icu_60::DateFormat::EStyle, icu_60::Locale const&, UErrorCode&) (in /usr/lib/x86_64-linux-gnu/libicui18n.so.60.2) ==8895== by 0x5FD700D: icu_60::SimpleDateFormat::SimpleDateFormat(icu_60::DateFormat::EStyle, icu_60::DateFormat::EStyle, icu_60::Locale const&, UErrorCode&) (in /usr/lib/x86_64-linux-gnu/libicui18n.so.60.2) ==8895== by 0x5FD05C9: icu_60::DateFormat::create(icu_60::DateFormat::EStyle, icu_60::DateFormat::EStyle, icu_60::Locale const&) (in /usr/lib/x86_64-linux-gnu/libicui18n.so.60.2) ==8895== by 0x4EE389B: boost::locale::impl_icu::icu_formatters_cache::icu_formatters_cache(icu_60::Locale const&) (in /usr/lib/x86_64-linux-gnu/libboost_locale.so.1.65.1) ==8895== by 0x4EE3B47: std::locale boost::locale::impl_icu::install_formatting_facets<char>(std::locale const&, boost::locale::impl_icu::cdata const&) (in /usr/lib/x86_64-linux-gnu/libboost_locale.so.1.65.1) ==8895== ==8895== 1,904 bytes in 1 blocks are still reachable in loss record 203 of 212 ==8895== at 0x4C3217F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==8895== by 0x4EE3B39: std::locale boost::locale::impl_icu::install_formatting_facets<char>(std::locale const&, boost::locale::impl_icu::cdata const&) (in /usr/lib/x86_64-linux-gnu/libboost_locale.so.1.65.1) ==8895== by 0x4ED3FCC: boost::locale::impl_icu::create_formatting(std::locale const&, boost::locale::impl_icu::cdata const&, unsigned int) (in /usr/lib/x86_64-linux-gnu/libboost_locale.so.1.65.1) ==8895== by 0x4ED3504: boost::locale::impl_icu::icu_localization_backend::install(std::locale const&, unsigned int, unsigned int) (in /usr/lib/x86_64-linux-gnu/libboost_locale.so.1.65.1) ==8895== by 0x4E988E8: boost::locale::localization_backend_manager::impl::actual_backend::install(std::locale const&, unsigned int, unsigned int) (in /usr/lib/x86_64-linux-gnu/libboost_locale.so.1.65.1) ==8895== by 0x4E9482B: boost::locale::generator::generate(std::locale const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const (in /usr/lib/x86_64-linux-gnu/libboost_locale.so.1.65.1) ==8895== by 0x4E95006: boost::locale::generator::generate(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const (in /usr/lib/x86_64-linux-gnu/libboost_locale.so.1.65.1) ==8895== by 0x109E01: boost::locale::generator::operator()(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const (in a.out)
我原本期望程序退出时内存能完全释放。
内容的提问来源于stack exchange,提问作者Ala Ma Kota
相关产品推荐
相关产品推荐

