5

ここにコード例があります

class A{
  int i;
public:
  A(int i) : i(i) {}
  void f() { prn(i); }
};

int main()
{
  A* pi = new A(9);
  A* pi2= new A(87);
  boost::shared_ptr<A> spi(pi);
  boost::shared_ptr<A> spi2(pi2);
  spi=spi2;
  spi->f();
  spi2->f();
  pi->f();
  pi2->f();
}

出力:

87
87
0
87

問題は、出力に 0 が含まれている理由です。

ドキュメントからのメモ: 効果: shared_ptr(r).swap(*this) と同等。

しかし、shared_ptrオブジェクトがスワップされたばかりの場合、結果は 9 になるはずです。また、最初のオブジェクトが削除された場合は、セグメンテーション違反が発生するはずです。

では、なぜ 0 なのですか?

4

4 に答える 4

6

スワップされているものに注意してください。

shared_ptr(r).swap(*this)
// ^^^^^^^^^^

から構築された一時オブジェクトrです。一時的なものはすぐに範囲外になり、これが所有するリソースにどのような影響を与えるかにかかわらず、死にます。あなたのコードspiでは の唯一の所有者だった*spiので、オブジェクトは削除され、その後の へのアクセスpi->f()は単に未定義の動作です。

于 2012-04-06T19:33:40.973 に答える
5

pi削除されました。削除されたオブジェクトのメンバーへのアクセスは未定義の動作です。0、その他の値、またはセグメンテーション違反が発生する可能性があります。

于 2012-04-06T19:32:29.823 に答える
1

では、なぜ 0 なのですか?

だからなんでも!

新しい値を割り当てると、spiそれが指している以前のオブジェクトが削除されます。はpi、もう使用できないダングリング ポインターを作成します。呼び出しpi->f()は未定義の動作であり、結果が生じる可能性があります。

于 2012-04-06T19:33:03.223 に答える
1

piオブジェクトは後で削除されspi = spi2、ランタイムが解放されたメモリに対して何をするかを誰が知っていますか。私にとっては、デバッグで -572662307、リリースで 1315904 が出力されます。

于 2012-04-06T19:33:05.837 に答える