gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:23:17 25 4
gpt4 key购买 nike

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

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

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

return getwindow.pWindow;

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

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

Q1

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

编辑2:

我想错了,我太蠢了。

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

int func()
{
int a = 10;
return a;
}

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

然而,事实并非如此。因为它是“按值返回”类型。该值被复制(某处),并且复制过程是在局部变量超出范围之前。

操作顺序类似于

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

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

  • 函数退出且局部变量变为无效(恢复 EBP)。
  • “按值返回的另一个优点是,您可以返回涉及函数内声明的局部变量的变量(或表达式),而不必担心作用域问题。因为变量是在函数返回之前计算的,并且该值的拷贝被返回给调用者,当函数的变量在函数结束时超出范围时,不会出现任何问题。”

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

    函数调用结果的复制初始化是按顺序进行的 - 在表达式末尾的所有临时对象销毁之前,而表达式末尾的所有临时对象的销毁又是按顺序进行的 - 在局部变量的销毁之前包含 return 语句的 block 的变量。”

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

    EBP 恢复

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

    我真丢脸!顺便感谢您的友好回答。

    最佳答案

    这是安全的。

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

    关于c++ - 返回局部结构变量的成员变量是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60626414/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com