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

时间:2013-05-26 13:16:22

标签: c++ mfc object-lifetime

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

      

    CWnd对象与Windows窗口不同,但两者紧密相关。 CWnd构造函数和析构函数创建或销毁CWnd对象。另一方面,Windows窗口是Windows内部的数据结构,由Create成员函数创建并由CWnd虚拟析构函数销毁。 DestroyWindow函数会在不破坏对象的情况下销毁Windows窗口。

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