Avoid spurious memory leak reports from static MSVC CRT
The leak check is done before the FlsAlloc()-installed callback function runs in this build variant and so reports wxThreadSpecificInfo object, and everything it contains, as leaked, even if it isn't, really, so deallocate it explicitly ourselves in this case. Also call wxThreadSpecificInfoTLS::CleanUp() from the main thread as well, which fixes a possible real (albeit one-time only, so not really) memory leak under XP where FLS API is not available.
This commit is contained in:
parent
3f7660f6c1
commit
cf66599eba
@ -238,6 +238,7 @@ Changes in behaviour which may result in build errors
|
|||||||
wxMSW:
|
wxMSW:
|
||||||
|
|
||||||
- Fix MSVS warning about redundant "const" in wx/itemid.h (#23590).
|
- Fix MSVS warning about redundant "const" in wx/itemid.h (#23590).
|
||||||
|
- Fix spurious memory leak reports when using static CRT.
|
||||||
|
|
||||||
|
|
||||||
3.2.3: (released 2023-10-10)
|
3.2.3: (released 2023-10-10)
|
||||||
|
@ -201,7 +201,12 @@ public:
|
|||||||
|
|
||||||
static void CleanUp()
|
static void CleanUp()
|
||||||
{
|
{
|
||||||
|
// To avoid bogus memory leaks reports when using debug version of
|
||||||
|
// static MSVC CRT we need to free memory ourselves even when it would
|
||||||
|
// have been done by FlsAlloc() callback because it does it too late.
|
||||||
|
#if !defined(_MSC_VER) || !defined(_DEBUG) || defined(_DLL)
|
||||||
if (!Instance().AllocCallback)
|
if (!Instance().AllocCallback)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
// FLS API was not available, which means that objects will not be freed automatically.
|
// FLS API was not available, which means that objects will not be freed automatically.
|
||||||
delete Get();
|
delete Get();
|
||||||
@ -1465,6 +1470,9 @@ bool wxThreadModule::OnInit()
|
|||||||
|
|
||||||
void wxThreadModule::OnExit()
|
void wxThreadModule::OnExit()
|
||||||
{
|
{
|
||||||
|
// Delete thread-specific info object for the main thread too, if any.
|
||||||
|
wxThreadSpecificInfoTLS::CleanUp();
|
||||||
|
|
||||||
if ( !::TlsFree(gs_tlsThisThread) )
|
if ( !::TlsFree(gs_tlsThisThread) )
|
||||||
{
|
{
|
||||||
wxLogLastError(wxT("TlsFree failed."));
|
wxLogLastError(wxT("TlsFree failed."));
|
||||||
|
Loading…
Reference in New Issue
Block a user