为什么只返回指向对象的指针?

Nic*_*ick 0 c++ c++11

我有一个最近解决的错误,但我想了解原因.我有一个使用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回收,所以悬空指针碰巧指向相同的数据.

这个答案可以在本地变量的内存其范围之外进行访问?提供了关于悬挂指针的最佳解释之一.

  • @Nick我认为你应该按值返回它,让编译器忽略副本. (3认同)
  • 不要使用`new`,不要使用智能指针,只需返回对象.`obj GetPointer(){... return test; }`.很简单,让编译器使其高效. (2认同)