使用 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()
。但是我再三查看代码,并不是这样的。
我是否误解了输出,泄漏可能在其他地方?
从追溯来看,newlocale
和 freelocale
的配对并不是罪魁祸首。还有许多构造函数(TLocale
、TDateTime
、TVariant
和 TField
)可能也必须被销毁(如果从中调用 freelocale
析构函数)。您应该检查那些 类 是否也没有内存泄漏(例如,如果您有一个没有 delete
的 new TLocale
,您会检测到另一个内存泄漏)。
如果不看足够的源代码,就很难说出更多内容。
我遇到内存泄漏和 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()
。但是我再三查看代码,并不是这样的。
我是否误解了输出,泄漏可能在其他地方?
从追溯来看,newlocale
和 freelocale
的配对并不是罪魁祸首。还有许多构造函数(TLocale
、TDateTime
、TVariant
和 TField
)可能也必须被销毁(如果从中调用 freelocale
析构函数)。您应该检查那些 类 是否也没有内存泄漏(例如,如果您有一个没有 delete
的 new TLocale
,您会检测到另一个内存泄漏)。
如果不看足够的源代码,就很难说出更多内容。