Skip to content

Commit 9708c97

Browse files
Fix memory leak
1 parent 0587384 commit 9708c97

File tree

2 files changed

+21
-5
lines changed

2 files changed

+21
-5
lines changed

src/framework/cloud/internal/abstractcloudservice.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -406,30 +406,38 @@ Ret AbstractCloudService::executeRequest(const RequestCallback& requestCallback)
406406

407407
Promise<Ret> AbstractCloudService::executeAsyncRequest(const AsyncRequestCallback& requestCallback)
408408
{
409-
return requestCallback().then<Ret>(this, [this, requestCallback](const Ret& ret, auto resolve) {
409+
//! NOTE: helps to avoid memory leak due to self-capture
410+
auto callback = new AsyncRequestCallback(requestCallback);
411+
412+
return requestCallback().then<Ret>(this, [this, callback](const Ret& ret, auto resolve) {
410413
if (ret) {
414+
delete callback;
411415
return resolve(ret);
412416
}
413417

414418
// Check whether tokens have expired...
415419
if (statusCode(ret) != USER_UNAUTHORIZED_STATUS_CODE) {
420+
delete callback;
416421
return resolve(ret);
417422
}
418423

419424
// Update tokens and retry request
420-
updateTokens().onResolve(this, [this, requestCallback, resolve](const Ret& ret) {
425+
updateTokens().onResolve(this, [this, callback, resolve](const Ret& ret) {
421426
if (!ret) {
427+
delete callback;
422428
(void)resolve(ret);
423429
return;
424430
}
425431

426432
Ret saveTokensRet = saveTokens();
427433
if (!saveTokensRet) {
434+
delete callback;
428435
(void)resolve(saveTokensRet);
429436
return;
430437
}
431438

432-
requestCallback().onResolve(this, [resolve](const Ret& ret) {
439+
(*callback)().onResolve(this, [resolve, callback](const Ret& ret) {
440+
delete callback;
433441
(void)resolve(ret);
434442
});
435443
});

src/project/internal/projectactionscontroller.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -900,8 +900,7 @@ void ProjectActionsController::uploadAudioToAudioCom(const AudioFile& audio, con
900900

901901
m_uploadingAudioProgress->finished().onReceive(this, [this, audio, project, info](const ProgressResult& res) {
902902
LOGD() << "Uploading audio finished";
903-
904-
audio.device->deleteLater();
903+
(void)audio; // make sure it lives long enough
905904

906905
if (!res.ret) {
907906
LOGE() << res.ret.toString();
@@ -915,6 +914,10 @@ void ProjectActionsController::uploadAudioToAudioCom(const AudioFile& audio, con
915914
project->setCloudAudioInfo(newInfo);
916915
}
917916
}
917+
918+
m_uploadingAudioProgress->started().disconnect(this);
919+
m_uploadingAudioProgress->progressChanged().disconnect(this);
920+
m_uploadingAudioProgress->finished().disconnect(this);
918921
});
919922
}
920923

@@ -1281,6 +1284,8 @@ Ret ProjectActionsController::uploadProject(const CloudProjectInfo& info, const
12811284
m_uploadingProjectProgress->finished().onReceive(this, [this, project, info, audio, openEditUrl, publishMode,
12821285
isFirstSave, &ret, &eventLoop](const ProgressResult& res) {
12831286
DEFER {
1287+
m_uploadingProjectProgress->progressChanged().disconnect(this);
1288+
m_uploadingProjectProgress->finished().disconnect(this);
12841289
eventLoop.quit();
12851290
};
12861291

@@ -1355,6 +1360,9 @@ void ProjectActionsController::uploadAudioToMuseScoreCom(const AudioFile& audio,
13551360
if (publishMode && (configuration()->alsoShareAudioCom() || configuration()->showAlsoShareAudioComDialog())) {
13561361
alsoShareAudioCom(audio);
13571362
}
1363+
1364+
m_uploadingAudioProgress->progressChanged().disconnect(this);
1365+
m_uploadingAudioProgress->finished().disconnect(this);
13581366
});
13591367
}
13601368

0 commit comments

Comments
 (0)