【问题标题】:icu::Calendar::createInstance() leaks memoryicu::Calendar::createInstance() 泄漏内存
【发布时间】:2014-04-02 04:51:31
【问题描述】:

这是一个泄漏的测试程序(在 Ubuntu 10.04、ICU 4.2 上):

#include <unicode/uversion.h>
#include <unicode/calendar.h>

int main()
{
  TimeZone* tz = TimeZone::createTimeZone("Asia/Pyongyang");

  UErrorCode status = U_ZERO_ERROR;
  Calendar* cal = Calendar::createInstance(tz, status); // adopts tz

  delete cal;
}

valgrind --leak-check=full 说:

==22978== 304 bytes in 1 blocks are possibly lost in loss record 20 of 22
==22978==    at 0x4C28F86: malloc (vg_replace_malloc.c:291)
==22978==    by 0x526B34D: icu_4_2::UnicodeString::allocate(int) (in /usr/lib/libicuuc.so.42.1)
==22978==    by 0x526B993: icu_4_2::UnicodeString::cloneArrayIfNeeded(int, int, signed char, int**, signed char) (in /usr/lib/libicuuc.so.42.1)
==22978==    by 0x526D97A: icu_4_2::UnicodeString::doReplace(int, int, unsigned short const*, int, int) (in /usr/lib/libicuuc.so.42.1)
==22978==    by 0x4EF0E90: icu_4_2::TimeZone::initDefault() (in /usr/lib/libicui18n.so.42.1)
==22978==    by 0x4EF10A4: icu_4_2::TimeZone::createDefault() (in /usr/lib/libicui18n.so.42.1)
==22978==    by 0x4EEE750: icu_4_2::GregorianCalendar::GregorianCalendar(icu_4_2::Locale const&, UErrorCode&) (in /usr/lib/libicui18n.so.42.1)
==22978==    by 0x4EEB493: ??? (in /usr/lib/libicui18n.so.42.1)
==22978==    by 0x4EEBA01: icu_4_2::Calendar::createInstance(icu_4_2::TimeZone*, icu_4_2::Locale const&, UErrorCode&) (in /usr/lib/libicui18n.so.42.1)
==22978==    by 0x400A42: icu_4_2::Calendar::createInstance(icu_4_2::TimeZone*, UErrorCode&) (in /home/jzwinck/test/a.out)
==22978==    by 0x4009C5: main

我的问题是,我是否错误地使用了 ICU,或者我可以应用一些解决方法来释放 ICU 似乎正在创建的默认时区对象?我无法轻易更改我正在使用的操作系统和 ICU 的版本。

【问题讨论】:

    标签: c++ memory-leaks valgrind icu


    【解决方案1】:

    您需要致电u_cleanup() 来清理 ICU。通常没关系,所以不会自动完成。如果您使用 --enable-auto-cleanup 构建 ICU,它将在某些平台上尝试在库卸载时进行清理。见the userguide

    【讨论】:

    • g++ 说error: use of undeclared identifier 'u_cleanup_57'。我该怎么办?
    猜你喜欢
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2013-01-20
    • 2011-10-31
    • 2019-08-10
    • 2013-06-24
    相关资源
    最近更新 更多