this questionで実験すると、私は完全に理解していない例を作りました。特に、私はポインタ、リファレンス、boost :: shared_ptrに関する誤解を強調しています。このコードを実行するboost :: shared_ptr質問。なぜこれは機能しますか?
int& r = *(new int(0));//gratuitous pointer leak, got to initialize it to something
{
boost::shared_ptr<int> sp(new int(100));
r = *sp;
cout << "r=" << r << endl;
}
cout << "r=" << r << endl << endl;
int* p;
{
boost::shared_ptr<int> sp(new int(100));
p = &*sp;
cout << "*p=" << *p << endl;
}
cout << "*p=" << *p << endl;
が出力にこのような何か与える:
r=100
r=100
*p=100
*p=13
をなぜ参照はのshared_ptrの死を生き残るが、ポインタはないでしょうか?ここではその中の回答で問題があります
は、2つの直径方向に対向すると矛盾したソリューションであり、真理であり、その上に無コンセンサスがあるように思われます。私は、shared_ptrが削除された後にリファレンスを使用する機能が欲しいですが、無効な場合はこれを本当に理解する必要があります。
誰かが、参照の未定義の動作を示す簡単な例を投稿する可能性があります。
ブロックの順番を逆にしても、参照は引き継がれ、ポインタは保持されません。しかし、これは運が単なる運だと言っていますよね? – JnBrymn
私のコメントは間違っていた、@ FredOverflowの答えを参照してください。申し訳ありません... –
'*(new ...) 'は書かないでください。実際には、「ヒープからいくつかのメモリを割り当てて、メモリがヒープから来たことを忘れてください」と言っています。参照ではなく値に割り当てると、回復不能なメモリリークが発生します。参照に割り当てても、クリーンアップには 'delete&r'が必要です。これは恐ろしく非慣用的です。 –