我看到几个代码示例显示了 MFC appObject(即 theApp
)的 InitInstance()
函数内部的变量和对象创建。我认为在函数退出时,在函数内部创建的任何东西都会消失。 InitInstance
函数确实在程序退出之前退出,就在显示窗口之后。
我错过了什么?这是如何工作的?
最佳答案
是的,你是对的:在函数范围内创建的具有自动存储持续时间的对象将在函数存在时自动销毁。
对于您所看到的内容有两种可能的解释(很难进一步缩小范围,因为您没有在问题中包含任何示例代码):
对象实际上是使用
new
关键字创建的,这意味着它们具有动态存储持续时间并且不会自动销毁。相反,它们必须使用delete
关键字手动销毁。除了看到new
之外,这种风格的一个死角是指针的使用——new
返回一个指向新对象的指针,所以你会看到*
无处不在。对象实际上不需要存在的时间长于声明它的函数。它可能是临时创建的,以便可以调用它的一些成员函数。这些成员函数的作用是全局的,或者具有超出类对象本身的作用。这在 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. ACWnd
object is created or destroyed by theCWnd
constructor and destructor. The Windows window, on the other hand, is a data structure internal to Windows that is created by aCreate
member function and destroyed by theCWnd
virtual destructor. TheDestroyWindow
function destroys the Windows window without destroying the object.
不过,您确实在问题中提到了无处不在的 theApp
对象。那个有点不同——它实际上是一个全局对象,因为它没有在任何函数范围内声明。它在程序开始执行时自动构造,在程序结束时自动销毁。
关于c++ - MFC 的 InitInstance 函数中创建的对象的生命周期有什么特别之处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16759598/