Details
-
Bug
-
Resolution: Cannot Reproduce
-
P1: Critical
-
None
-
5.0.0
-
None
Description
A memory leak occurs in code which calls QDeclarativeTypeData::compile(), possibly due to the way that QDeclarativeTypeData::compiledData() addref()s the typedata before returning it. If calling code ever addref()s the typedata after retrieving it in this fashion, the refcount will never go back to zero, if the client balances their addref()s with release()s.
Valgrind output is as follows:
==8972== 240 (32 direct, 208 indirect) bytes in 2 blocks are definitely lost in loss record 259 of 339
==8972== at 0x402569A: operator new(unsigned int) (vg_replace_malloc.c:255)
==8972== by 0x42E40DE: QDeclarativeTypePrivate::init() const (qdeclarativemetatype.cpp:376)
==8972== by 0x42E47DA: QDeclarativeType::containsRevisionedAttributes() const (qdeclarativemetatype.cpp:536)
==8972== by 0x42B99E8: QDeclarativeCompiler::compile(QDeclarativeEngine*, QDeclarativeTypeData*, QDeclarativeCompiledData*) (qdeclarativecompiler.cpp:603)
==8972== by 0x42F3248: QDeclarativeTypeData::compile() (qdeclarativetypeloader.cpp:907)
==8972== by 0x42F2749: QDeclarativeTypeData::done() (qdeclarativetypeloader.cpp:824)
==8972== by 0x42EF876: QDeclarativeDataBlob::tryDone() (qdeclarativetypeloader.cpp:382)
==8972== by 0x42F097E: QDeclarativeDataLoader::setData(QDeclarativeDataBlob*, QByteArray const&) (qdeclarativetypeloader.cpp:615)
==8972== by 0x42F0238: QDeclarativeDataLoader::load(QDeclarativeDataBlob*) (qdeclarativetypeloader.cpp:512)
==8972== by 0x42F0F5E: QDeclarativeTypeLoader::get(QUrl const&) (qdeclarativetypeloader.cpp:645)
==8972== by 0x42A3FB8: QDeclarativeComponent::loadUrl(QUrl const&) (qdeclarativecomponent.cpp:536)
==8972== by 0x42A36C1: QDeclarativeComponent::QDeclarativeComponent(QDeclarativeEngine*, QUrl const&, QObject*) (qdeclarativecomponent.cpp:437)
==8972== by 0x80598F6: tst_qdeclarativeecmascript::extensionObjects() (tst_qdeclarativeecmascript.cpp:623)
==8972== 248 bytes in 2 blocks are definitely lost in loss record 261 of 339
==8972== at 0x4024F20: malloc (vg_replace_malloc.c:236)
==8972== by 0x5EB2FA0: qMalloc(unsigned int) (qmalloc.cpp:55)
==8972== by 0x433FF0B: QMetaObjectBuilder::toMetaObject() const (qmetaobjectbuilder.cpp:1450)
==8972== by 0x42E41CC: QDeclarativeTypePrivate::init() const (qdeclarativemetatype.cpp:390)
==8972== by 0x42E47DA: QDeclarativeType::containsRevisionedAttributes() const (qdeclarativemetatype.cpp:536)
==8972== by 0x42B99E8: QDeclarativeCompiler::compile(QDeclarativeEngine*, QDeclarativeTypeData*, QDeclarativeCompiledData*) (qdeclarativecompiler.cpp:603)
==8972== by 0x42F3248: QDeclarativeTypeData::compile() (qdeclarativetypeloader.cpp:907)
==8972== by 0x42F2749: QDeclarativeTypeData::done() (qdeclarativetypeloader.cpp:824)
==8972== by 0x42EF876: QDeclarativeDataBlob::tryDone() (qdeclarativetypeloader.cpp:382)
==8972== by 0x42F097E: QDeclarativeDataLoader::setData(QDeclarativeDataBlob*, QByteArray const&) (qdeclarativetypeloader.cpp:615)
==8972== by 0x42F08B7: QDeclarativeDataLoader::loadWithStaticData(QDeclarativeDataBlob*, QByteArray const&) (qdeclarativetypeloader.cpp:590)
==8972== by 0x42F1002: QDeclarativeTypeLoader::get(QByteArray const&, QUrl const&, QFlags<QDeclarativeTypeLoader::Option>) (qdeclarativetypeloader.cpp:659)
==8972== by 0x42A3C58: QDeclarativeComponent::setData(QByteArray const&, QUrl const&) (qdeclarativecomponent.cpp:484)
==8972== by 0x8063B6D: tst_qdeclarativeecmascript::bug2() (tst_qdeclarativeecmascript.cpp:1399)
==8972== 8,990 (120 direct, 8,870 indirect) bytes in 1 blocks are definitely lost in loss record 339 of 339
==8972== at 0x402569A: operator new(unsigned int) (vg_replace_malloc.c:255)
==8972== by 0x42F30EA: QDeclarativeTypeData::compile() (qdeclarativetypeloader.cpp:901)
==8972== by 0x42F2749: QDeclarativeTypeData::done() (qdeclarativetypeloader.cpp:824)
==8972== by 0x42EF876: QDeclarativeDataBlob::tryDone() (qdeclarativetypeloader.cpp:382)
==8972== by 0x42F097E: QDeclarativeDataLoader::setData(QDeclarativeDataBlob*, QByteArray const&) (qdeclarativetypeloader.cpp:615)
==8972== by 0x42F0238: QDeclarativeDataLoader::load(QDeclarativeDataBlob*) (qdeclarativetypeloader.cpp:512)
==8972== by 0x42F0F5E: QDeclarativeTypeLoader::get(QUrl const&) (qdeclarativetypeloader.cpp:645)
==8972== by 0x42A3FB8: QDeclarativeComponent::loadUrl(QUrl const&) (qdeclarativecomponent.cpp:536)
==8972== by 0x42A36C1: QDeclarativeComponent::QDeclarativeComponent(QDeclarativeEngine*, QUrl const&, QObject*) (qdeclarativecomponent.cpp:437)
==8972== by 0x807EF97: tst_qdeclarativeecmascript::aliasBindingsAssignCorrectly() (tst_qdeclarativeecmascript.cpp:2999)