【问题标题】:function returning a pointer to automatic variable返回指向自动变量的指针的函数
【发布时间】:2017-08-31 15:03:35
【问题描述】:

因此,我正在使用一个在大脑图像 I/O 方面已有十多年历史的“标准”库。我遇到了这个功能:

   nifti_image* nifti_image_read( const char *hname , int read_data ){

   nifti_image* nim;
...

<<<some IO operations>>>

...

return nim;
}

我的问题是,这个函数怎么会返回一个指向自动变量的本地指针?由于nim指针超出范围并且应该在函数完成后删除,这种做法是否被禁止?

我已经阅读了this 的问题,但无法得到答案:

【问题讨论】:

  • 它按值返回 num 的副本。据推测,“一些 IO 操作”会使用一些数据的地址加载 num,这些数据的生命周期可能超过“nifti_image_read()”的生命周期。这很好,然后,返回它的地址也是如此。
  • @ThingyWotsit 我对按值返回与按引用进行了一些研究,现在明白了。谢谢。

标签: c memory-management stack automatic-storage


【解决方案1】:

它只是返回 nim 指针的值。
在 > 部分中,我假设 nim 设置为指向堆或全局中的某个永久内存。

【讨论】:

    【解决方案2】:

    您没有返回指向局部变量的指针。您正在返回一个恰好是指针的局部变量的

    假设指针本身没有指向另一个局部变量,这是一个安全的操作。

    【讨论】:

      【解决方案3】:

      此函数返回存储在指针中的值,没问题。指针值是一个对象的地址,它可能是动态分配的并且不会在最后被删除,即使它是 C++。唯一可能的问题是指针指向另一个局部变量,而不是动态分配的情况。因此,即使指针本身超出范围,接收返回值的调用者也会获得有效对象地址的副本。

      【讨论】:

      • 所以我猜是同一个函数,但它通过引用返回,例如:nifti_image*& nifti_image_read() 会出错吗?
      • 带有 & 符号的引用是一个 C++ 特性,我是严格的 C 你不能使用它们。这里的事实是,指针在函数之后不再存在,但调用者在另一个变量中接收它的值,这就足够了。
      猜你喜欢
      • 2010-11-16
      • 1970-01-01
      • 2020-10-13
      • 2013-04-10
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      相关资源
      最近更新 更多