use*_*455 5 c++ memory stack pointers
这是一些C++代码.
#include <iostream>
using namespace std;
class test{
    int a;
  public:
    test(int b){
    a = b;
    cout << "test constructed with data " << b << endl;
  }
  void print(){
    cout << "printing test: " << a << endl;
  }
};
test * foo(){
    test x(5);
    return &x;
}
int main()
{
    test* y = foo();
    y->print();
    return 0;
}
这是它的输出:
test constructed with data 5
printing test: 5
我的问题:为什么指向x的指针仍然在函数foo的上下文之外"工作"?据我所知,函数foo创建了一个test实例并返回该对象的地址.
函数退出后,变量x超出范围.我知道C++不是垃圾收集 - 变量超出范围时会发生什么?为什么在foo()中返回的地址仍指向看似有效的对象?
如果我在某个范围内创建一个对象,并希望在另一个范围内使用它,我应该在堆中分配它并返回指针吗?如果是这样,我何时/何地将其删除
谢谢
x是一个局部变量.之后foo的回报有没有保证,该堆栈上的内存x驻留在是损坏或完整.这是未定义行为的本质.在阅读之前运行一个函数x,你会发现引用"死"变量的危险:
void nonsense(void)
{
    int arr[1000] = {0};
}
int main()
{
    test* y = foo();
    nonsense();
    y->print();
    return 0;
}
我机器上的输出:
用数据5
打印测试构建的测试:0