アドレスを取得し、Goの関数内のローカル変数へのポインタを返すと、コンパイラはスタックではなくヒープに割り当てるため、返されたポインタは有効なままです。Goで構造体メンバまたは埋め込み構造体にポインタを戻していますか?
ここで、構造体メンバーまたは埋め込み構造体のアドレスを取得して返すとどうなりますか?
type A struct {
a,b,c int
}
type B struct {
A
d,e,f int
}
func (b *B) get1() *A {
return &b.A
}
func (b *B) get2() *A {
localB := B{}
return &localB.A
}
コンパイラはヒープに組み込みの構造体Aを割り当て、Bのメンバーをスタックに保持しますか?
localB.A参照がまだ使用されていても、ガベージコレクタはlocalBを収集しますか?
リフレクションによってアクセスされた場合、スタックまたはヒープに埋め込み構造体を保持する方法をコンパイラが決定する方法を教えてください。
こちらは安全です。あなたは単に**ダングリングポインタを生成することはできません。あなたが何をするかは問題ではありません(あなたが安全でないパッケージから離れている場合)。コンパイラはここで安全に動作しています。スタック上の割り当てが安全であることが証明できない場合は、ヒープに割り当てられます。何も心配する必要はありません。一緒に移動。 – Volker
@Volker私は指をぶらつくことを心配していませんが、私はすぐにガベージコレクションされていない構造を囲むことについて心配しています。 – alpav
最初に:タイプAは空であり、あなたの例では何も収集されません。 GCがlocalB.Aが使用されている場合、localBをどのように集めることができるのかより、実際にはAが空ではないと仮定しますか?あなたはGCが壊れていると仮定していますか? – Volker