というわけで俺々 scoped_ptr つくった。ちなみに未完成品。 http://gist.github.com/713685 RT @SubaruG: boost::scoped_ptr はカスタム削除子を指定できないのと release 出来ないのが不満。
2010-11-24 23:03:00完成品では、 std::auto_ptr のカスタムデリータ対応版と相互利用できるようにしようかと。まぁ std::unique_ptr さんがいれば要らないんだけど、私用以外で大手を振って std::unique_ptr を使えるのは何年後になるか分からんし。
2010-11-24 23:04:12new 演算子を多重定義するのは落とし穴も多いから、お勧めはできん。いや、分かって使う分には問題ないけど。 new 演算子は原理的に例外安全だし。
2010-11-25 17:07:24例外はスレッドをまたいで影響が出る性格のものではないと思います。無論コンストラクタ中で他のスレッドと同期してたらデッドロック等が起こる可能性はありますが QT @SubaruG: マルチスレッド的にはどうだか知らない。
2010-11-25 17:16:55new は「メモリを確保」して「オブジェクトを構築」する。このときメモリ確保に必要な引数とオブジェクト構築に必要な引数は別々に受け取る必要があるので、関数ではなく演算子なのです。
2010-11-25 17:19:15@fadis_ いや、例外安全的にはアトミックだけど、マルチスレッド的にはアトミックかどうかは知らないって意味。
2010-11-25 17:21:39@SubaruG マルチスレッドにおける(スレッドセーフではなく)アトミックは一般的なシステムでは1命令で実行されるってのと等価なので、そっちの意味でのアトミックの条件を満たしていたらむしろビックリだと思いますw
2010-11-25 17:26:05スレッドセーフ: 途中で別のスレッドが割り込んできても正しい結果が得られる アトミック: 途中で別のスレッドが割り込んでくることは絶対に無い
2010-11-25 17:28:29@fadis_ 厳密にアトミックって意味ではなく、実質的に、ですね。例外安全だって、例外の投げうる処理を2つやってるので、厳密にはアトミックじゃないのです。
2010-11-25 17:31:20new 演算子呼び出しでは内部で try ~ catch 相当の処理が必要になる。実際には最適化がかかるだろうけど。
2010-11-25 17:33:47mutable メンバの是非はマルチスレッドを使うか否かで大きく主張が分かれるよね。僕は是派だけど(遅延評価おいしいです)、マルチスレッド考えると厄介だというのには同意できる。
2010-11-25 18:13:44mutable メンバを持ったクラスの場合、スレッディングポリシーを指定できるようにするのがマルチスレッド対策ではベストかなー。侵入的にやらなきゃいけない分だけ面倒だけど、外付けはもっと面倒だし。
2010-11-25 18:15:10