c++ - MFC 的 InitInstance 函数中创建的对象的生命周期有什么特别之处?

标签 c++ mfc object-lifetime

我看到几个代码示例显示了 MFC appObject(即 theApp)的 InitInstance() 函数内部的变量和对象创建。我认为在函数退出时,在函数内部创建的任何东西都会消失。 InitInstance 函数确实在程序退出之前退出,就在显示窗口之后。

我错过了什么?这是如何工作的?

最佳答案

是的,你是对的:在函数范围内创建的具有自动存储持续时间的对象将在函数存在时自动销毁。

对于您所看到的内容有两种可能的解释(很难进一步缩小范围,因为您没有在问题中包含任何示例代码):

  1. 对象实际上是使用new 关键字创建的,这意味着它们具有动态存储持续时间并且不会自动销毁。相反,它们必须使用 delete 关键字手动销毁。除了看到 new 之外,这种风格的一个死角是指针的使用——new 返回一个指向新对象的指针,所以你会看到 * 无处不在。

  2. 对象实际上不需要存在的时间长于声明它的函数。它可能是临时创建的,以便可以调用它的一些成员函数。这些成员函数的作用是全局的,或者具有超出类对象本身的作用。这在 MFC 中很常见,因为大多数类都是 Win32 API 的包装器。

    例如,CWnd 类只是 Win32 窗口的面向对象包装器,由 HWND(或窗口句柄)表示。您可以创建一个 CWnd 对象,使用它来创建和操作 Windows 窗口 (HWND),然后允许它被销毁而不影响底层 Windows 窗口。 CWnd documentation 的“备注”部分谈谈这种令人困惑的行为:

    A CWnd object is distinct from a Windows window, but the two are tightly linked. A CWnd object is created or destroyed by the CWnd constructor and destructor. The Windows window, on the other hand, is a data structure internal to Windows that is created by a Create member function and destroyed by the CWnd virtual destructor. The DestroyWindow function destroys the Windows window without destroying the object.

不过,您确实在问题中提到了无处不在的 theApp 对象。那个有点不同——它实际上是一个全局对象,因为它没有在任何函数范围内声明。它在程序开始执行时自动构造,在程序结束时自动销毁。

关于c++ - MFC 的 InitInstance 函数中创建的对象的生命周期有什么特别之处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16759598/

相关文章:

c++ - 结构数组似乎不想工作

c++ - 为什么将内联函数def放在其他包含内联函数声明的头文件的头文件中是链接错误?

c++ - 如何在 MFC 中设置菜单项旁边的复选标记?

c++ - 如何让 CListCtrl 保持其滚动条?

c - 绑定(bind)生命周期如何可以比对象生命周期长?

objective-c - 在委托(delegate)回调期间应该如何延长委托(delegate)对象的生命周期?

c++ - 使用 placement new 更新引用成员?

c++ - Visual C++ 2008错误,编译简单文件

c++ - c++-通过抽象模板基类接口(interface)指针访问派生类方法,而接口(interface)中没有显式类型

linux - 转换MFC Doc/View到?