我有一个最近解决的错误,但我想了解原因。我有一个使用c ++ 11的cmake项目。
这适用于mac osx但不适用于ubuntu。它在ubuntu上返回null。
obj *getPointer(){
obj test = obj(1,2,3);
return &test;
}
这适用于:
obj *getPointer(){
obj* ptr;
obj test = obj(1,2,3);
ptr = &test
return &ptr;
}
答案 0 :(得分:11)
您的两个实例都会调用未定义的行为(UB),因为您返回的是本地对象obj test
的地址f(n) = sin(n)
g(n) = cos(n)
,该函数在函数出口处被销毁,因此您最终会一个悬垂的指针。它只是"发生"工作,但任何事情都可能发生,所以你应该不惜一切代价避免UB!
要理解它为什么会起作用,那是因为可能在函数退出时操作系统还没有回收函数的堆栈,所以悬空指针恰好指向相同的数据
automatic storage duration至This answer提供了我曾经见过的关于悬挂指针的最佳解释之一。