返回局部结构变量的成员变量是否安全?

Yoo*_* OH 3 c++

struct SGetWindow
{
    HWND__* pWindow;
};
Run Code Online (Sandbox Code Playgroud)
SGetWindow getWindow;
EnumWindows(GetWindowProc, reinterpret_cast<LParam>(&getWindow));
return getWindow.pWindow;
Run Code Online (Sandbox Code Playgroud)

使用 SGetWindow 结构体作为 LParam,成功更新 HWND__* pWindow。

我想知道这种返回局部结构变量的成员变量的用法是否安全。

return getwindow.pWindow;
Run Code Online (Sandbox Code Playgroud)

安全吗?或导致未定义的行为?

编辑:我添加了一个图像以供理解。

第一季度

我了解到指针的值(0x00000000000506D8 或 0x00000000000606D8)1)在函数终止后有效,2)将被复制。但我认为这并不能保证安全性,因为问题似乎是“访问(不再存在的本地结构成员变量),并返回其值”。

编辑2:

我想错了,我太笨了。

根据我的想法,即使返回本地 int 变量也会导致未定义的行为。例如,

int func()
{
int a = 10;
return a;
}
Run Code Online (Sandbox Code Playgroud)

函数退出时,局部变量“a”不再有效。因此,返回值是未定义的行为。

然而,这不是。因为它是“按值返回”类型。值被复制(某处),复制过程是在局部变量超出范围之前。

操作顺序类似于

  1. 为局部变量分配 n 个字节并将其值设置为 10。

2. 将局部变量的值复制到“某处”。

  1. 函数退出且局部变量无效(恢复 EBP)。

“按值返回的另一个优点是您可以返回涉及在函数内声明的局部变量的变量(或表达式),而不必担心作用域问题。因为在函数返回之前评估变量,并且值的副本是返回给调用者,当函数的变量在函数结束时超出范围时,没有问题。 ”

https://www.learncpp.com/cpp-tutorial/74a-returning-values-by-value-reference-and-address/

“函数调用结果的复制初始化顺序在表达式末尾的所有临时变量的销毁之前,反过来,在包含 return 语句的块的局部变量的销毁之前。”

https://en.cppreference.com/w/cpp/language/return

EBP 还原

https://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames

耻辱我!顺便感谢您的友好回答。

dbu*_*ush 5

这是安全的。

您正在返回 的值getWindow.pWindow,它恰好是一个指针。该指针由对 的调用填充EnumWindows,而不是通过分配局部变量的地址。