Details
-
Bug
-
Resolution: Duplicate
-
Not Evaluated
-
None
-
5.10
-
None
Description
Code is simple, used QSharedPointer and deleter to detect the lambda is or not released.
// Qt lin import #include <QtCore> #include <QtConcurrent> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QtConcurrent::run( [ ]() { // Case 1: Memory leak, no "release" log forever { qDebug( "new" ); QSharedPointer< int > test( new int, [ ](int *p){ qDebug( "release" ); delete p; } ); QMetaObject::invokeMethod( qApp, [ test ]() { qDebug() << test.data(); } ); QThread::sleep( 1 ); } // Case 2: Work fine, "release" log has been print; forever { qDebug( "new" ); QSharedPointer< int > test( new int, [ ](int *p){ qDebug( "release" ); delete p; } ); QtConcurrent::run( [ test ]() { qDebug() << test.data(); } ); QThread::sleep( 1 ); } } ); return a.exec(); }
In both cases, the lambda executes normally.
but the lambda is not released in case 1, the variables captured into the lambda and the lambda itself not to be released, Cause a memory leak.
Attachments
Issue Links
- duplicates
-
QTBUG-65462 leak in new Qt 5.10 QMetaObject::invokeMethod + lambda
-
- Closed
-