我有一个最近解决的错误,但我想了解原因.我有一个使用c ++ 11的cmake项目.
这适用于mac osx但不适用于ubuntu.它在ubuntu上返回null.
obj *getPointer(){
obj test = obj(1,2,3);
return &test;
}
Run Code Online (Sandbox Code Playgroud)
这适用于:
obj *getPointer(){
obj* ptr;
obj test = obj(1,2,3);
ptr = &test
return &ptr;
}
Run Code Online (Sandbox Code Playgroud)
vso*_*tco 11
这两个实例都会调用未定义的行为(UB),因为您正在返回obj test具有自动存储持续时间的本地对象的地址,该地址对象在函数的退出处被销毁,因此您最终会得到一个悬空指针.只是"发生"工作,但任何事情都可能发生,所以你应该不惜一切代价避免UB!
要理解为什么它会发生工作,那是因为可能在函数退出时函数的堆栈还没有被OS回收,所以悬空指针碰巧指向相同的数据.
这个答案到可以在本地变量的内存其范围之外进行访问?提供了关于悬挂指针的最佳解释之一.