1

以下のコードでセグメンテーション違反が発生する可能性はありますか?

struct Dim {
  int x, y, z;
};

Dim set_dim(int a) {
 Dim l;
 l.x=a;
 l.y=a;
 l.z=a;
 return l;
}

int sum(const Dim &m) {
  int s=m.x+m.y;
  return s;
}

main() {
  cout<<sum(set_dim(5))<<endl;
}

set_dim でローカル変数 'l' が参照されているため、つまり、スコープ外の変数への参照が行われているためだと思います。しかし、それが機能することは決してありません

4

3 に答える 3

3

の参照lは取得されません (直接ではなく、間接的に戻り値の最適化が原因である可能性がありますが、それについて心配する必要はありません)。

  • set_dimのコピーをl返します。に渡される一時的なコピーsum

  • sumconst 参照を取り、すべてがうまく機能し、 sum返されるまで全員が幸せに暮らしているため、一時的なものを受け入れることができます。

于 2013-04-21T14:39:43.523 に答える
3

これは明確に定義されています。set_dimは値で返すため、返されるオブジェクトはローカル変数の一時的なコピーですl。このテンポラリは、 のconst参照引数にバインドされますsum。これは、一時オブジェクトの有効期間に影響します。

関数呼び出し (5.2.2) の参照パラメーターへの一時的なバインドは、呼び出しを含む完全な式が完了するまで持続します。

したがって、一時オブジェクトの有効期間は full-expressioncout<<sum(set_dim(5))<<endl;です。sum実行中も存在します。

于 2013-04-21T14:40:09.283 に答える
1

set_dim参照ではなく l のコピーを返すため、seg fault の可能性はないと思います。

于 2013-04-21T14:43:09.460 に答える