1

共有ポインタが原因で、プログラムのダーティシャットダウンで問題が発生しました。解決策を見つけましたが、正しい答えがあるかどうかはわかりません。

これは最小限の例です。

double var;
boost::shared_ptr<const double> ptr1 (&var); // creates an invalid pointer on program exit
boost::shared_ptr<const double> ptr2 (new double); // works fine

int main (int argc, char **argv)
{
  return 0;
}

これが私が検証したい私の答えです:

ポイントされたオブジェクトの場合ptr1、ポインタの前に削除され、ポインタは無効なアドレスを指します。しかしptr2、共有ポインタの「スマートさ」の場合、上記の問題を処理します。本当ですか?

ちょっとした追加の質問:ptr1を機能させる方法はありますか(私は試しましたreset())、それともその悪いプログラミング手法ですか(もしそうならなぜですか)?

説明してくれてありがとう!

4

1 に答える 1

4

最初のケースでは、ポインタは動的に割り当てられないため、shared_ptr は基になるオブジェクトを破棄しようとすべきではありません。これは、カスタム no-op deleter functor を使用して実行できます。

http://www.boost.org/doc/libs/1_51_0/libs/smart_ptr/sp_techniques.html#static

于 2012-09-26T02:32:56.377 に答える