1. ホーム
  2. C++

std::bad_alloc の取り扱いについて

2022-02-25 01:01:26
<パス

もちろん、ここではしばらくは自分の状況を話すだけです。最近、反復時間が長く、全部で800回の反復を行うC++プログラムを実行し、1日待った後、284回目の反復でハングし、再度実行すると、また同じところでハングしてしまいました。解放されていないメモリアプリケーションがないか、いろいろと調べました(delete[])。最終的に、苦労の末、小人ベクターがぐちゃぐちゃになっていることがわかりました。

での http://www.educity.cn/wenda/257316.html と書かれている中で



"真実はあなたの想像を超えている、私の友人は直接メモリを食い尽くすためにベクターを使用し、それを適切にチェックアウトする



たくさんある場合は、手動でクリアしたほうがいいかもしれませんし、ベクターなしでやってみても、おそらく問題はないでしょう



ベクターは内部メモリの断片化だけでなく、外部メモリの断片化も引き起こすということが主な内容です

ベクターは連続した空間を開放します、例えばこの空間が100Mあるとします、そんな大きな連続した空間を割り当ててエラーを報告することはできません。



メモリに1Gが残っていても、連続した100Mのスペースがなければ、bad_alloc"になります。

からの抜粋です。 http://www.cnblogs.com/BeyondAnyTime/archive/2012/08/08/2627666.html ベクターの非常に良いまとめ



v.~ vector () と言って、すべてのデータを破棄し、メモリを解放します。



そして、別の投稿を見た。



http://www.cnblogs.com/lxshanye/archive/2013/05/20/3088558.html



C++のベクターは、C#のように管理されたガベージコレクション機構を持って占有メモリ空間を取り戻すことはできないが、ベクターを使い終わったら~vector()デストラクタを呼び出してメモリを解放できると書かれています。

この方法をさっそく試してみると、一発で成功!



ネットの神様に改めて感謝です

その後、またうまくいかなくなり、1200回以上の反復に走ったところでまたクラッシュしてしまいました。今度は後ろに座っていた神・阿龍に聞いてみると、一度に20万行のデータだけをベクターに読み込めば、本当に1~2メガバイトと非常に小さくなるそうです。自分で配列を開いておいて、それをクリアしないで、次からは上書きすればいいんじゃないかと言われました。お礼を言った後、変更しようとしたら、アーロンが立ち上がって、自分で開かなくてもいいから、"new vector"の行を出せばいいと言ってきました。つまり、関数内でnew vectorしているから、スタックの中のスペースしか開けず、1、2メガバイトしかないのだそうです。これは関数の外、つまりファイルスコープに置くべきで、そうすればヒープにスペースを開くことができます。

周りに神様がいる感じは、今窓の外に見える空のようで、とても眩しいです!