使用 Valgrind 输出调查内存泄漏

Invetstigate memory leak with Valgring output

我遇到内存泄漏和 Valgrind 输出的问题:

==4501== 15,263,488 bytes in 59,623 blocks are definitely lost in loss record 5,941 of 5,942
==4501==    at 0x4C2BBA0: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4501==    by 0x6CC78D1: newlocale (newlocale.c:201)
==4501==    by 0x527EE7: app::TLocale::create(app::ELocale) (locale.cpp:141)
==4501==    by 0x5276AD: app::TLocale::TLocale() (locale.cpp:38)
==4501==    by 0x50091E: util::TDateTime::TDateTime(util::EDateTimeType) (datetime.cpp:828)
==4501==    by 0x587EE4: util::TVariant::TVariant() (variant.cpp:74)
==4501==    by 0x561215: data::TField::TField() (tables.cpp:193)
==4501==    by 0x554EA7: sqlite::TQuery::assignFields() (sqlite.cpp:631)
==4501==    by 0x553C80: sqlite::TQuery::next() (sqlite.cpp:415)
==4501==    by 0x4F8E06: sql::TDataQuery::fetchAll() (database.cpp:219)
==4501==    by 0x5CD499: app::TMain::qryPersonalData(std::string&, unsigned long, unsigned long, std::string const&, unsigned long) (main.cpp:1616)
==4501==    by 0x5CCF86: app::TMain::getPersonalData(app::TThreadData&, char const*&, unsigned long&, util::TNamedVariants&) (main.cpp:1568)

如果我看第一行,我会假设 newlocale() 没有 freelocale()。但是我再三查看代码,并不是这样的。

我是否误解了输出,泄漏可能在其他地方?

从追溯来看,newlocalefreelocale 的配对并不是罪魁祸首。还有许多构造函数(TLocaleTDateTimeTVariantTField)可能也必须被销毁(如果从中调用 freelocale析构函数)。您应该检查那些 类 是否也没有内存泄漏(例如,如果您有一个没有 deletenew TLocale,您会检测到另一个内存泄漏)。

如果不看足够的源代码,就很难说出更多内容。