阅读一些我遇到的代码
static void initializeX11SBConfig(X11SBConfig* sbConfig) {
X11SBConfig defX11SBConfig = {
.sbStyle = SB_STYLE_W32,
.sbFgColor = RGB(0, 0, 0),
.sbBgColor = RGB(255, 255, 255),
.sbOverScroll = FALSE
};
defX11SBConfig.sbWidth = GetSystemMetrics(SM_CXVSCROLL);
*sbConfig = defX11SBConfig;
}
Run Code Online (Sandbox Code Playgroud)
AFAICT defX11SBConfig是一个自动变量,因此在退出时sbConfig将指向堆栈中的某些不再有效的位置.事情应该快速炸弹,因为这些颜色参考通常在程序的其他地方使用.但他们没有.
我的C非常生疏,所以我可能会忘记默认情况下在hgeap上分配的初始化结构或者其他东西.
还有什么在这里会更好?mallocing结构?要求在进入时由sbConfig进行预分配的结构?其他?
不.不采用局部变量的地址; 它的值被复制(到sbConfig指针指定的对象).
这一行:
*sbConfig = defX11SBConfig;
Run Code Online (Sandbox Code Playgroud)
将整个结构值复制defX11SBConfig到指定的位置sbConfig.(你似乎在印象之下,它将defX11SBConfig 的地址存储在非本地指针变量中).地址defX11SBConfig不泄漏功能; 没有悬空指针.该sbConfig参数是本身不修改(仅适用于它所指向).此外,即使sbConfig被修改,其值也不会泄漏,因为更改不会反映给调用者.
在C中,如果您从未使用address-of运算符获取局部变量的地址&,则该地址不会从其包含函数泄漏.