C 窗口过程中的静态变量

C 窗口过程中的静态变量,c,winapi,static,C,Winapi,Static,我在dialog的窗口过程中创建了一个静态变量。当此对话框关闭(但应用程序仍在运行)时,静态变量hwndChildDialog是否被删除,其内存地址是否可用?如果没有,我应该和如何做这清洁 INT_PTR CALLBACK Dialog_Preference_Proc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static HWND hwndChildDialog = CreateDialog(...); } C中的s

我在dialog的窗口过程中创建了一个静态变量。当此对话框关闭(但应用程序仍在运行)时,静态变量
hwndChildDialog
是否被删除,其内存地址是否可用?如果没有,我应该和如何做这清洁

INT_PTR CALLBACK Dialog_Preference_Proc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)

{
    static HWND hwndChildDialog = CreateDialog(...);

}

C中的
static
关键字在“静态内存”中的某个位置创建变量,意思是:变量的地址在程序的生命周期内不会改变,它在内存中的位置是“static”(因此该关键字)。因此,无论何时何地访问变量:它始终是它的同一个实例

它的内存地址无法释放


在这种情况下,您不必做任何事情来释放“CreateDialog”,您只需要ShowWindow和DestroyWindow。

C中的
static
关键字在“静态内存”的某个位置创建变量,意思是:变量的地址在程序的生命周期内不会改变,它在内存中的位置是“静态的”因此,无论何时何地访问变量:它始终是它的同一个实例

它的内存地址无法释放


在这种情况下,您不必做任何事情来释放“CreateDialog”,只需ShowWindow和DestroyWindow。

一个“静态”变量不是“全局”变量,它是在内存的“静态”部分创建的(意思是“非堆”和“非堆栈”,这将使变量在离开当前范围后消失”)..堆栈上的一个变量在离开当前作用域后自动释放。@akira,我认为Keith对“类似全局且仅在一个函数中可见”的描述是一个很好的描述。@akira,这就是为什么我说它“基本上”的原因一个全局,就所有的目的而言,它是一个只在函数作用域内可见的全局。堆栈变量不是真正的“资源”。它们只是作用域内的变量,在作用域外它们就消失了(不管它们是否在堆栈上,事实上,有时它们只是在寄存器中),它是“全局的”与所有内存的意义相同:给我一个指针,我将它悬挂起来:)或者与所有“字符串”都是“全局”的意义相同,因为它们最终位于相同的.text部分。我只是觉得“static”的描述有点马虎。它更像是概念性的,而不是迂腐的:)一个“static”变量不是“全局的”,它是在内存的“static”部分创建的(意思是“not heap”和“not stack,这将使变量在离开当前范围后消失”)。。。堆栈上的一个变量在离开当前作用域后会自动释放。@akira,我认为Keith对“类似全局且仅在一个函数中可见”的描述是一个很好的描述。@akira,这就是为什么我说它“基本上”是一个全局变量,出于各种目的,它是一个仅在函数作用域中可见的全局变量。堆栈变量不是真正的“资源”。它们只是作用域内的变量,在作用域外它们就消失了(不管它们是否在堆栈上,事实上,有时它们只是在寄存器中),它是“全局的”,与所有内存的意义相同:给我一个指针,我将它悬挂起来:)或者与所有“字符串”都是“全局的”因为它们最终都在同一个文本部分。我只是觉得对“静态”的描述有点马虎。它更像是概念性的,而不是迂腐的:)事实并非如此。也不会释放使用它创建的对话框。使用WM_INITDIALOG将是实现这一点的更明智的方法,但事实并非如此。也不会释放使用它创建的对话框。使用WM_INITDIALOG将是实现这一点的更明智的方法。