Fixed a memory leak.

This commit is contained in:
unknown 2010-11-07 16:32:54 +01:00
parent 36ae27f5f3
commit 8fa0757455
5 changed files with 48 additions and 7 deletions

View File

@ -65,7 +65,7 @@
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalOptions="&quot;/MANIFESTDEPENDENCY:type=&apos;win32&apos; name=&apos;Microsoft.Windows.Common-Controls&apos; version=&apos;6.0.0.0&apos; publicKeyToken=&apos;6595b64144ccf1df&apos; language=&apos;*&apos; processorArchitecture=&apos;*&apos;&quot;" AdditionalOptions="&quot;/MANIFESTDEPENDENCY:type=&apos;win32&apos; name=&apos;Microsoft.Windows.Common-Controls&apos; version=&apos;6.0.0.0&apos; publicKeyToken=&apos;6595b64144ccf1df&apos; language=&apos;*&apos; processorArchitecture=&apos;*&apos;&quot;"
AdditionalDependencies="qtmaind.lib QtCored4.lib QtGuid4.lib Winmm.lib" AdditionalDependencies="qtmaind.lib QtCored4.lib QtGuid4.lib Winmm.lib psapi.lib"
LinkIncremental="1" LinkIncremental="1"
AdditionalLibraryDirectories="&quot;$(QTDIR)\lib&quot;;&quot;$(QTDIR)\plugins\imageformats&quot;" AdditionalLibraryDirectories="&quot;$(QTDIR)\lib&quot;;&quot;$(QTDIR)\plugins\imageformats&quot;"
GenerateDebugInformation="true" GenerateDebugInformation="true"

View File

@ -136,6 +136,7 @@ MainWindow::~MainWindow(void)
LAMEXP_DELETE(m_tabActionGroup); LAMEXP_DELETE(m_tabActionGroup);
LAMEXP_DELETE(m_fileListModel); LAMEXP_DELETE(m_fileListModel);
LAMEXP_DELETE(m_banner); LAMEXP_DELETE(m_banner);
LAMEXP_DELETE(m_fileSystemModel);
} }
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////

View File

@ -38,6 +38,10 @@
//LameXP includes //LameXP includes
#include "LockedFile.h" #include "LockedFile.h"
//Debug only includes
#ifdef _DEBUG
#include <Psapi.h>
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// GLOBAL VARS // GLOBAL VARS
@ -278,18 +282,19 @@ bool lamexp_clean_folder(const QString folderPath)
} }
/* /*
* Finalization function (Clean-up) * Finalization function (final clean-up)
*/ */
void lamexp_finalization(void) void lamexp_finalization(void)
{ {
//Free all tools //Free all tools
while(!g_lamexp_tool_registry.isEmpty()) if(!g_lamexp_tool_registry.isEmpty())
{ {
QStringList keys = g_lamexp_tool_registry.keys(); QStringList keys = g_lamexp_tool_registry.keys();
for(int i = 0; i < keys.count(); i++) for(int i = 0; i < keys.count(); i++)
{ {
delete g_lamexp_tool_registry.take(keys.at(i)); LAMEXP_DELETE(g_lamexp_tool_registry[keys.at(i)]);
} }
g_lamexp_tool_registry.clear();
} }
//Delete temporary files //Delete temporary files
@ -304,10 +309,11 @@ void lamexp_finalization(void)
} }
//Destroy Qt application object //Destroy Qt application object
QCoreApplication *application = QApplication::instance(); QApplication *application = dynamic_cast<QApplication*>(QApplication::instance());
LAMEXP_DELETE(application); LAMEXP_DELETE(application);
//Detach from shared memory //Detach from shared memory
if(g_lamexp_sharedmem_ptr) g_lamexp_sharedmem_ptr->detach();
LAMEXP_DELETE(g_lamexp_sharedmem_ptr); LAMEXP_DELETE(g_lamexp_sharedmem_ptr);
} }
@ -338,3 +344,18 @@ const QString lamexp_lookup_tool(const QString &toolName)
return QString(); return QString();
} }
} }
/*
* Get number private bytes [debug only]
*/
SIZE_T lamexp_dbg_private_bytes(void)
{
#ifdef _DEBUG
PROCESS_MEMORY_COUNTERS_EX memoryCounters;
memoryCounters.cb = sizeof(PROCESS_MEMORY_COUNTERS_EX);
GetProcessMemoryInfo(GetCurrentProcess(), (PPROCESS_MEMORY_COUNTERS) &memoryCounters, sizeof(PROCESS_MEMORY_COUNTERS_EX));
return memoryCounters.PrivateUsage;
#else
throw "Cannot call this function in a non-debug build!";
#endif //_DEBUG
}

View File

@ -55,6 +55,9 @@ const QString &lamexp_temp_folder(void);
//Auxiliary functions //Auxiliary functions
bool lamexp_clean_folder(const QString folderPath); bool lamexp_clean_folder(const QString folderPath);
//Debug-only functions
SIZE_T lamexp_dbg_private_bytes(void);
//Helper macros //Helper macros
#define LAMEXP_DELETE(PTR) if(PTR) { delete PTR; PTR = NULL; } #define LAMEXP_DELETE(PTR) if(PTR) { delete PTR; PTR = NULL; }
#define LAMEXP_CLOSE(HANDLE) if(HANDLE != NULL && HANDLE != INVALID_HANDLE_VALUE) { CloseHandle(HANDLE); HANDLE = NULL; } #define LAMEXP_CLOSE(HANDLE) if(HANDLE != NULL && HANDLE != INVALID_HANDLE_VALUE) { CloseHandle(HANDLE); HANDLE = NULL; }
@ -73,3 +76,18 @@ bool lamexp_clean_folder(const QString folderPath);
FatalAppExit(0, L"Not a debug build. Please unload debugger and try again!"); \ FatalAppExit(0, L"Not a debug build. Please unload debugger and try again!"); \
TerminateProcess(GetCurrentProcess, -1); } TerminateProcess(GetCurrentProcess, -1); }
#endif #endif
//Memory check
#if defined(_DEBUG)
#define LAMEXP_MEMORY_CHECK(CMD) \
{ \
SIZE_T _privateBytesBefore = lamexp_dbg_private_bytes(); \
CMD; \
SIZE_T _privateBytesLeak = (lamexp_dbg_private_bytes() - _privateBytesBefore) / 1024; \
if(_privateBytesLeak > 10) { \
qWarning("Memory leak: Lost %u KiloBytes.", _privateBytesLeak); \
} \
}
#else
#define LAMEXP_MEMORY_CHECK(CMD) CMD
#endif

View File

@ -142,8 +142,9 @@ int main(int argc, char* argv[])
{ {
try try
{ {
int iResult;
qInstallMsgHandler(lamexp_message_handler); qInstallMsgHandler(lamexp_message_handler);
int iResult = lamexp_main(argc, argv); LAMEXP_MEMORY_CHECK(iResult = lamexp_main(argc, argv));
lamexp_finalization(); lamexp_finalization();
return iResult; return iResult;
} }