ブログトップ 記事一覧 ログイン 無料ブログ開設

神様なんて信じない僕らのために このページをアンテナに追加 RSSフィード

2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
基本的に適当な日記です。あまり鵜呑みにしないでください。土日はWeb離れしているので反応遅れます。

2009-03-19

[]std::vectorはそんなにダメか?

いま、メインでstd::vectorを使っているんですけれども、

「vectorってclearでメモリが解放されないんですよ!!!!」

という話を聴いた。

「シーンを遷移したらメモリの使用量が増えていたのでメモリリークしていると思ったらvectorがpush_backでメモリを再確保してましたよ!!」

という話を聴いた。

「vectorってiteratorを回している間にpush_backするとiteratorが壊れるんですよ」

という話を聴いた。


vectorはダメだろうか?

そもそも、自分はvectorより優れた実装の「可変長配列」を書けるプログラマがそんなにいるとは思っていない。

vectorの実装は概ね納得できるし、

clearでメモリが解放されないときはswapすれば良いと知っているし、

push_backでメモリを確保されたくなければreserveすれば良いし、

iteratorを走査中に要素を追加すればぶっ壊れる可能性があるのは自明だ。

わかりきっていれば「そういうものだ」という実装も、

わからない人にとっては不可思議な動作となる。

少なくとも自分には、

clearでメモリを解放されたら非効率だし、

reserveしないでpush_backは非効率だし、

iteratorを触っているのにpush_backは恐るべき行為だ。

うーん。

要するにアレだ。

「知っていないと使えない事が多すぎる」

うん。

そうだそうだ、C++はSTLはBoostは知っていないと使えない事が多すぎる。

だからといって、

これが正義と学習コストを持ち上げて

「そんなの勉強しませんよ」

なんて言ってしまうのはどうかと思うわけで、

解らないなら知ろうとすればいいんじゃないですかねえ。

r_ikedar_ikeda 2009/03/19 00:51 C++怖い><

bonezinebonezine 2009/03/19 02:09 秀逸な改変コピペ作れそうです

IsoparametricIsoparametric 2009/03/19 10:26 r_ikedaさん
自分も怖いです><

bonezineさん
コピペして作ってください><

堀江伸一堀江伸一 2011/05/27 22:24 push_backすると目盛の再確保がされてiteratorの指すアドレスと違ってしまう?でしたっけ?

一つ疑問なのですが
std::set<std::vector<int> > data;
でstd::set<std::vector<int> >::iterator it;
のitを回してるときの(*it).push_backは安全なのでしょうか?
これでも危ない場合はあるのでしょうか?

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/Isoparametric/20090319/1237388515