You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:34:55