2017-04-05 17 views
-1

私は脳画像I/Oの10年以上の歴史を持つ "標準"ライブラリを扱っています。私はこの関数に遭遇しました:関数は自動変数へのポインタを返します

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

    nifti_image* nim; 
... 

<<<some IO operations>>> 

... 

return nim; 
} 

私の質問は、どうやって自動変数へのローカルポインタを返すのでしょうか? nimポインタが範囲外になり、関数の完了後に削除されるはずなので、この方法は禁止されていませんか?

私はすでにthis質問を読みましたが、私の答えを得ることができませんでした:

+0

数値で数値のコピーを返しています。おそらく、 'some IO operations'ロードは、その寿命が 'nifti_image_read()'の寿命を超える可能性のあるデータのアドレスであると考えられます。それはちょうどいいです、そして、それはその住所を返すです。 – ThingyWotsit

+0

@ThingyWotsit私は参考値と比較して値を返すことについていくつかの研究を行い、今ポイントを得ました。ありがとう。 – Sourena

答えて

0

この関数は、ポインタに格納されている値を返しています。これは問題ありません。ポインタ値は、おそらく動的に割り当てられたオブジェクトのアドレスであり、たとえそれがC++であっても、最後には削除されません。唯一の可能性のある問題は、ポインタが別のローカル変数を指し、動的に割り当てられていない場合です。そのため、ポインタ自体が有効範囲外になっても、戻り値を受け取った呼び出し側は有効なオブジェクトのアドレスのコピーを取得します。

+0

だから私は同じ関数を推測するが、参照によって返される:nifti_image *&nifti_image_read()は間違っているだろうか? – Sourena

+0

&表記との参照はC++の機能です。私はそれらを使用することはできません。ここでの事実は、ポインタは関数の後に存在しなくなりますが、呼び出し元はその値を別の変数に受け取ります。これで十分です。 –

1

それはちょうどNIMポインタの値を返すです。
< <一部のIO操作>>パートでは、nimがヒープまたはグローバルの永続メモリをポイントするように設定されていると仮定します。

0

ポインタをローカル変数に戻していません。あなたはポインターになるローカル変数のを返しています。

ポインタが別のローカル変数自体を指していないと仮定すると、これは安全な操作です。

関連する問題