2013-02-20 73 views
0
#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

+3

欢迎使用未定义的行为。 – WhozCraig 2013-02-20 15:46:09

+0

您确定这可行吗?那么,堆栈帧会丢失,但在函数终止后内存仍然存在,但实际上它不应该发生...... – 2013-02-20 15:47:46

+0

标准说哪里应该得到seg-fault? – 2013-02-20 15:52:39

回答

0

当我打印由该指针在人指出()的值,然后我应该得到一个SEG-故障。

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

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

6

x对象确实从retPointer()返回时,和解除引用一个指针一个对象,其使用寿命已经期满是未定义行为超出范围。

有未定义行为的程序意味着什么可能发生,包括碰撞,表现得好像什么都没有发生(如*retPointer()恢复正常值如10),或格式化您的硬盘驱动器。

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