【问题标题】:Return with Ampersand用 & 号返回
【发布时间】:2014-12-31 13:58:33
【问题描述】:

我必须在函数中返回结构对象的指针,但我没有将它们存储为指针,所以我使用return &myStructObject; 来返回。它没有给出任何编译时错误,但我想要做的是正确的?

【问题讨论】:

  • 你不应该返回局部变量的地址。
  • 这取决于myStructObject 的生命周期。如果它是一个局部变量,当你从函数返回时它会被销毁并导致未定义的行为。
  • 所讨论的结构对象是方法的本地对象吗?
  • myStructObject 不是局部变量,它是类的成员并由构造初始化。

标签: c++ pointers struct return ampersand


【解决方案1】:

如果您引用的结构对象是函数的本地对象,那么您不应返回该结构对象的地址。这是因为当你的函数将调用返回给它的调用者时,所有的局部变量都会从内存中销毁。

例如:-

以下是致命错误

int* myFunc ()
{
  int p = 4;            // memory is allocated for p.
  // do something.
  return &p;            // memory for p is deallocated and you are returning pointer to that memory 
}

【讨论】:

  • “你不能返回那个结构对象的地址”。这不是真的。你可以做到这一点。这不是一个好主意,但程序会编译。
  • 可能想看看我链接的副本。
  • 如果错误被保证是致命的,那就太好了。
【解决方案2】:

如果你要返回的struct变量在函数返回后还在作用域内,那么你的做法是正确的。

另一方面,如果所讨论的结构变量是函数的本地变量,并且在您从函数返回后将被销毁(释放),那么您将返回的指针将是 dangling pointer,并且不会提供服务你的目的。

编辑:

“不会达到你的目的”,我的意思是它不会做你认为它会做的事!当你确定它没有做你期望它做的事情时,讨论它会造成什么伤害是没有意义的!

【讨论】:

  • 请详细说明“不会达到您的目的”,以明确它的不可预测性和危险性。此链接可能有助于这样做:stackoverflow.com/q/2397984
【解决方案3】:

如果你在一个函数中有一些本地的东西并且你正在返回它的地址,它将会丢失,即无效。原因是您返回地址的函数将从堆栈中弹出,并且任何非静态(非全局)都将丢失。从本质上讲,程序内存没有作为“终身”资源的任何东西都将消失。您可以将指针作为参数传递给函数并取消引用它以修改指针指向的值。但是任何非静态(或非全局)并作为地址返回的东西都会导致您访问违规类型错误。

【讨论】:

  • 您没有解释我在答案中提到的内容。您只需分配和释放内存,然后尝试访问内存。我在回答中说了什么?这是关于离开范围和离开堆栈。
猜你喜欢
  • 2015-12-06
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多