Solved Memory leak using QThread issue
-
So I put initialization of translator (
appTranslator = new QTranslator(this);
) in the constructor.appTranslator->load(":Localization/Test_ru.qm"); qApp->installTranslator(appTranslator);
Then I have added
qApp->removeTranslator(appTranslator);
at the end toloadTraslatedText
function, but now my other windows are not translated (when I open them). The problem is withqApp->removeTranslator(appTranslator);
So where to remove the one currently installed? -
@ambershark said in Memory leak using QThread issue:
@Cobra91151 This isn't Qt code.. You should probably post this question on a win32 API message board.
Also are you sure it's actually leaking? Just because the size of memory for your running application grows does not mean it's leaking. You need something like valgrind to test for leaks on exit.
Yea checking active running memory does not show you leaks. If it changes in task manager that is ok, if when you exit the app there are still pointers to memory that didn't get cleaned up then those are leaks.
If as you watch your program run and be used it is constantly growing while running in the task manager that can be a leak too, but not just because you did something like allocate a new language.
The way memory usually works is block are allocated and freed as they are needed. So if you allocate a new block, even though you delete your old one, the OS doesn't necessarily reclaim that memory unless it is needed. So in task manager you would see it change unless you were out of memory then you would see it reclaimed.
So unless you see it constantly growing and growing, out of control, while running it's probably not leaking. That is why you need a tool like valgrind to detect actual leaks.
-
- Remove the currently loaded translator
- Delete it
- Create the new translator
- Install it
-
Thanks, but the problem is with
WMI
. And I'm working to fix it. -
OK. I will try it and reply.
-
Thank you. I have fixed the WMI memory leak issue by releasing resources.
Code:
VariantClear(&serviceName); VariantClear(&servicePath); VariantClear(&serviceID); VariantClear(&serviceType); VariantClear(&serviceState); VariantClear(&serviceStatus); VariantClear(&serviceErrorControl); VariantClear(&serviceStartMode); VariantClear(&serviceWaitHint); VariantClear(&serviceExitCode); pclsObj->Release(); } } // Cleanup pService->Release(); pLocator->Release(); pEnumerator->Release(); CoUninitialize(); emit finished(); return 0; // Program successfully completed. }
-
I have change
appTranslator
to stacked object, because I can't find the appropriate place to delete it. So now my function where I load local. files looks like this:Code:
void Test::changeLanguage(int languageIndex) { languageChanged = true; QString systemLocale = QLocale::system().name(); switch (languageIndex) { case 0: if (systemLocale == "en_US") { qApp->removeTranslator(&appTranslator); appTranslator.load(":Localization/Test_en.qm"); qApp->installTranslator(&appTranslator); } if (systemLocale == "ru_RU") { qApp->removeTranslator(&appTranslator); appTranslator.load(":Localization/Test_ru.qm"); qApp->installTranslator(&appTranslator); } if (systemLocale == "uk_UA") { qApp->removeTranslator(&appTranslator); appTranslator.load(":Localization/Test_uk.qm"); qApp->installTranslator(&appTranslator); } break; case 1: qApp->removeTranslator(&appTranslator); appTranslator.load(":Localization/Test_en.qm"); qApp->installTranslator(&appTranslator); break; case 2: qApp->removeTranslator(&appTranslator); appTranslator.load(":Localization/Test_ru.qm"); qApp->installTranslator(&appTranslator); break; case 3: qApp->removeTranslator(&appTranslator); appTranslator.load(":Localization/Test_uk.qm"); qApp->installTranslator(&appTranslator); break; default: QMessageBox::critical(this, QObject::tr("Error"), QObject::tr("Can't change localization!"), QMessageBox::Ok); } }
I think this should work now?
-
@Cobra91151 It should work depending on where appTranslator is declared.
Back to what @SGaist suggested:qApp->removeTranslator(appTranslator); // Remove old translator delete appTranslator; // Delete old translator appTranslator = new QTranslator(this); appTranslator->load(":Localization/Test_ru.qm"); qApp->installTranslator(appTranslator);
That's it.
Documentation actually says that removing translator does not delete it, see http://doc.qt.io/qt-5/qcoreapplication.html#removeTranslator
In your code you actually was removing the new translator instead of the old one:appTranslator = new QTranslator(this); // You create new one qApp->removeTranslator(appTranslator); // You try to remove the new one appTranslator->load(":Localization/Test_ru.qm"); qApp->installTranslator(appTranslator);
-
Thanks for code example. I have declared it in a header file as stacked object.
-
Issue is solved. Thanks all for the help.