我看到几个代码示例显示了MFC appObject的InitInstance()
函数内的变量和对象创建(即theApp
)。我认为函数内部创建的任何函数都会在函数退出时死亡。在显示窗口之后,InitInstance
函数似乎在程序退出之前退出。
我错过了什么?这是如何工作的?
答案 0 :(得分:3)
是的,你是对的:当函数存在时,在功能范围内创建的具有自动存储持续时间的对象将被自动销毁。
对于您所看到的内容,有两种可能的解释(由于您没有在问题中包含任何示例代码,因此很难将其缩小范围):
实际上是使用new
关键字创建对象,这意味着它们具有动态存储持续时间并且不会自动销毁。相反,必须使用delete
关键字手动销毁它们。除了看new
之外,这种风格的一个主要功能就是指针的使用 - new
返回一个指向新对象的指针,所以你会在整个地方看到*
。
该对象实际上 的存在时间不会超过声明它的函数。它可能是临时创建的,因此可以调用它的一些成员函数。这些成员函数的效果是全局的,或者具有超出类对象本身的效果。这在MFC中很常见,因为大多数类都是围绕Win32 API的包装器。
例如,CWnd
类只是围绕Win32窗口的面向对象的包装器,由HWND
(或窗口句柄)表示。您可以创建一个CWnd
对象,使用它来创建和操作Windows窗口(HWND
),然后允许在不影响底层Windows窗口的情况下销毁它。 CWnd
documentation的“备注”部分谈到了这种令人困惑的行为:
CWnd
对象与Windows窗口不同,但两者紧密相关。CWnd
构造函数和析构函数创建或销毁CWnd
对象。另一方面,Windows窗口是Windows内部的数据结构,由Create
成员函数创建并由CWnd
虚拟析构函数销毁。DestroyWindow
函数会在不破坏对象的情况下销毁Windows窗口。
但您确实在问题中提到了无处不在的theApp
对象。那个有点不同 - 它实际上是一个全局对象,因为它没有在任何函数的范围内声明。它在程序开始执行时自动构建,并在程序结束时自动销毁。