当超出范围时,堆栈上的局部变量不会被删除

时间:2013-02-20 15:45:01

标签: c++ undefined-behavior

#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-fault。当我从函数retPointer()返回时,变量x应该超出范围。因此,当尝试访问main()中的值时,我是否应该得到分段错误?我在这里错过了什么吗?

输出= x = 10

2 个答案:

答案 0 :(得分:6)

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

具有未定义行为的程序意味着任何可能发生,包括崩溃,表现得好像没有发生任何事情(例如*retPointer()返回正常值,例如10),或格式化您的硬盘。

虽然最后一个选项不太可能,但你确实希望你的程序中有未定义的行为。不要使用自动存储返回指向本地对象的指针或引用。

答案 1 :(得分:0)

  

当我在man()中打印此指针指向的值时,我应该得到一个seg-fault。

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

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