1

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

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

4

1 回答 1

3

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

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

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

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

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

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

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

于 2013-05-26T13:25:05.203 回答