タイトルの通り。
何か変。
std::auto_ptr<test> t;
t = new Test();
↑これを実行すると、アクセス違反になる。
t.reset(new Test());
にすればOK。
operator =がおかしいっぽいんだけど。
見てみると、なぜかauto_ptr_refを引数に取るようにしてる。
で、そこからポインタのポインタを辿って…
auto_ptr<_Ty>&
operator=(auto_ptr_ref<_Ty> _Right) _THROW0()
{ // assign compatible _Right._Ref
(assume pointer)
_Ty **_Pptr = (_Ty **)_Right._Ref;
_Ty *_Ptr = *_Pptr;
*_Pptr = 0;
// release old
reset(_Ptr);
// set new
return (*this);
}
*_Pptr = 0; // release old
↑これって一体どこが0になるんだろ。
Refの指してる場所って、呼び出し側のスタック領域じゃ?
なんかわけわからんので、auto_ptrはやめてboost::scoped_ptrにしようかと思いました。
STLってだいぶ陳腐化してるなぁ…。
追記:
http://d.hatena.ne.jp/xanthus/20080205/p2
↑ここで詳しく解説されてました。
やっぱ、0入れてるとこで領域ぶっ壊してるよねw
で、boost::scoped_ptrはnewされたポインタを扱うoperator =がありませんでした。
はいはいワロスワロス。
まあ普通にresetでいいかー。
所有権とかワケワカメな要素が無いので、auto_ptrよりはscoped_ptrのほうが効率が良いっぽい。
あぁー。俺は普通に代入がしたいんだ!
自由なタイミングでnewしたいじゃん。



