Я вижу несколько примеров кода, показывающих переменные и создания объектов внутри InitInstance()
функция приложения MFC (т.е. theApp
). Я думал, что все, что создано внутри функции, умирает при выходе из функции. И InitInstance
Функция, по-видимому, завершается до выхода из программы, сразу после отображения окон.
Что мне не хватает? Как это работает?
Да, вы правы: объекты, созданные в области действия функции с автоматическим хранением, будут автоматически уничтожены, когда функция существует.
Есть два возможных объяснения того, что вы видите (его сложно сузить, так как вы не включили пример кода в свой вопрос):
Объекты на самом деле создаются с использованием new
ключевое слово, что означает, что они имеют динамическую продолжительность хранения и не уничтожаются автоматически. Вместо этого они должны быть уничтожены вручную с помощью delete
ключевое слово. В дополнение к видению new
мертвая распродажа этого стиля — использование указателей —new
возвращает указатель на новый объект, так что вы увидите *
повсюду.
Объект на самом деле не необходимость существовать дольше, чем функция, в которой он объявлен. Он может быть временно создан только для того, чтобы можно было вызывать некоторые его функции-члены. Эффекты этих функций-членов являются глобальными или имеют последствия вне самого объекта класса. Это довольно распространено в MFC, так как большинство классов являются оболочками вокруг Win32 API.
Например, CWnd
класс — это просто объектно-ориентированная оболочка вокруг окна Win32, представленная HWND
(или ручкой к окну). Вы можете создать CWnd
объект, используйте его для создания и управления окном Windows (HWND
), а затем разрешить его уничтожение без влияния на основное окно Windows. Раздел «Замечания» CWnd
документация немного говорит об этом запутанном поведении:
CWnd
Объект отличается от окна Windows, но оба тесно связаны.CWnd
объект создан или уничтоженCWnd
конструктор и деструктор. Окно Windows, с другой стороны, представляет собой структуру данных, внутреннюю для Windows, которая создаетсяCreate
функция-член и уничтоженаCWnd
виртуальный деструктор.DestroyWindow
Функция разрушает окно Windows, не разрушая объект.
Вы упомянули вездесущий theApp
возражать в вашем вопросе, хотя. Это немного отличается — это на самом деле Глобальный объект, потому что он не объявлен внутри области видимости любой функции. Он автоматически создается, когда программа начинает выполняться, и автоматически уничтожается, когда программа заканчивается.
Других решений пока нет …