2007年2月19日月曜日

std::auto_ptrの新たな罠(VC8)

VC8では以下のコードがあっさりコンパイルされるようです。

std::auto_ptr<int> p(new char);


これのせいでバッファオーバーフローに半日悩まされました。どう考えても罠です!親切でもなんでもないです。キャストしたかったら自分でします!
boost::shared_ptr使うほどでもないかなというケースでstd::auto_ptr使っていましたがそれすらやめたほうがよさそうですね。。

ちなみに、VC7.1でもgcc 3.4.4でも確認してみましたが、コンパイルエラーになりました。
そりゃ普通そうですよね。

2 コメント:

匿名 2007年2月22日 0:09  

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=101842
VC8付属のSTLのバグだそうです。auto_ptr_ref を導入した際のエンバグっぽいですね。
> boost::shared_ptr使うほどでもないかなというケースでstd::auto_ptr使っていましたがそれすらやめたほうがよさそうですね。。
それはまずいと思います。auto_ptrは ownership の移動と放棄を、shared_ptr は共有を実現するためにあるので、shared_ptr さえあれば auto_ptr はいらないということにはなりません。

匿名 2007年2月22日 8:52  

1年も前にバグとしてしっかり載っていたんですね。SP1で修正してほしかった…。
勿論auto_ptrの特性については理解していますが、所有権をあまり気にする必要がない場面でよく気軽に利用していました。
(関数内などの小さなスコープでauto deleteしたくなったときなど。)
本来はscoped_ptrを使うべきなんですが。。
「boost::shared_ptr使うほどでもないかなというケース」と書いたのはそういう意味です。ちょっと分りにくい表現をしてしまいましたね。。すみません。

  © Blogger template 'Isolation' by Ourblogtemplates.com 2008

Back to TOP