【问题标题】:C++, Win32: How Do I Call a Function After Main() ExitsC++、Win32:如何在 Main() 退出后调用函数
【发布时间】:2014-03-06 17:15:49
【问题描述】:

我有这个代码:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

MyEditor myEditor;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
    while(true)
    {  
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if(msg.message == WM_QUIT)
            { break; }

            TranslateMessage(&msg);
            DispatchMessage(&msg);

            myEditor.Update();
        }
    }

    return 0;
}

我想在 main() 退出后立即运行这个函数:

_CrtDumpMemoryLeaks();

原因是,如果我在 return 0 行之前调用此函数,“myEditor”析构函数还没有被调用,我会收到大量内存泄漏警报。 所以我想在我的班级的析构函数被调用后调用它来真正检查是否有任何泄漏。

我试过了:

void CheckLeaks(void)
{
    _CrtDumpMemoryLeaks();
}

//And inside the Main() block:
atexit(CheckLeaks);

但是没有用(实际上它可能有效,但我的类析构函数可能还没有被调用)。 我知道我可以将我的类放在 Main() 块中并检查,但是该类必须处理来自 MessageProc 的输入和命令,所以我现在真的需要它全局。

操作系统是 Windows 7(我找到了一些相关的东西,但它似乎只适用于 Linux),IDE 是 Visual Studio 2012。

我该怎么做?

【问题讨论】:

  • 为什么不简单地使用newdelete 手动为类实例分配和取消分配内存?
  • @enhzflep 这是个好主意!为我的班级使用动态内存有什么副作用或缺点(它有点大,因为它是整个程序)?
  • 好。 :) 我想不出任何。如果它是一个大类,它可能更好地从堆而不是堆栈中分配。

标签: c++ visual-studio-2012 windows-7


【解决方案1】:

虽然我认为这不是一个好主意,一种方法是创建一个全局对象并将代码添加到其析构函数中。

一般来说,您应该尽可能使用 RAII 原则来避免内存泄漏问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-19
    • 2012-05-11
    • 1970-01-01
    • 2016-02-29
    • 2016-01-31
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多