堆栈上的本地变量在超出范围时未被删除

Local variable on the stack not getting deleted when out of scope

本文关键字:范围 删除 变量 堆栈      更新时间:2023-10-16
#include <iostream>
int* retPointer()
{
    int x=10; //same as auto int x =10;
    return &x;
}
int main(int argc, char **argv)
{
    std::cout<<"x="<<*retPointer()<<std::endl;
    return 0;
}

在上面的例子中,我返回一个指向要堆栈的局部变量的指针。当我在man((中打印这个指针指向的值时,我应该会得到一个seg错误。当我从函数retPointer((返回时,变量x应该超出范围。所以,当尝试访问main((中的值时,我应该不会出现分段错误吗?我是不是遗漏了什么?

输出=x=10

retPointer()返回时,x对象确实超出范围,并且取消引用指向生存期已过期对象的指针是未定义行为

具有Undefined Behavior的程序意味着任何都可能发生,包括崩溃、表现得好像什么都没发生一样(如*retPointer()返回正常值,如10(,或格式化硬盘驱动器。

尽管最后一个选项不太可能,但您肯定不想在程序中有未定义的行为。永远不要使用自动存储返回指向本地对象的指针或引用。

当我在man((中打印这个指针指向的值时,我应该会得到一个seg错误。

你应该?规范中说这会发生在哪里?

您正在调用未定义的行为任何事情都有可能发生。