2017-04-05 85 views
-1

因此,我正在使用一個具有超過十年曆史的「標準」庫,用於大腦圖像I/O。我遇到過這個功能:函數返回指向自動變量的指針

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

    nifti_image* nim; 
... 

<<<some IO operations>>> 

... 

return nim; 
} 

我的問題是,這個函數是如何將一個本地指針返回給一個自動變量?這是不是禁止這種做法,因爲nim指針超出範圍,應該在函數完成後刪除?

我已經看過this的問題,但不能讓我的答案是:

+0

它按值返回num的一個副本。據推測,「一些IO操作」會將一些數據的地址加載到數據中,這些數據的生存期可能會超過'nifti_image_read()'的數據。這很好,然後,返回它的地址。 – ThingyWotsit

+0

@ThingyWotsit我做了一些關於價值迴歸與參照回報的研究,現在已經得到了重點。謝謝。 – Sourena

回答

0

該函數返回存儲在指針中的值,並且沒問題。指針值是一個對象的地址,它可能是動態分配的,最後不會被刪除,即使它是C++。唯一可能的問題是指針指向另一個局部變量,而不是動態分配的情況。因此,即使指針本身超出範圍,接收返回值的調用方也會獲取有效對象地址的副本。

+0

所以我猜相同的功能,但通過引用返回像:nifti_image *&nifti_image_read()會是錯誤的? – Sourena

+0

帶有&符號的引用是一個C++特性,我非常嚴格,您可以使用它們。這裏的事實是,指針在函數後不再存在,但調用者在另一個變量中接收到它的值,這就足夠了。 –

1

這只是返回NIM指針的值。
在< < <一些IO操作>>第一部分我假設nim被設置爲指向堆或全局中的某些永久內存。

0

您沒有返回指向局部變量的指針。您正在返回碰巧是指針的局部變量的

假設指針本身沒有指向另一個局部變量,這是一個安全的操作。