これは、手書きのループなどの代わりにSTLアルゴリズムを使用して、古い宿題を書き直そうとする試みです。
私はデータベースと呼ばれるクラスを持っています。このクラスではVector<Media *>
、Media *は(とりわけ)CDまたはBookになります。データベースは動的メモリを処理する唯一のクラスであり、プログラムが起動すると、以下のようにフォーマットされたファイルを読み取り(多少簡略化)、エントリを読み取るときにスペースを割り当て、上記のベクトル(v_)に追加します。
CD アーティスト アルバム ID番号 本 著者 タイトル ID番号 本 ..。 ..。
手書きのループを使用すると、これらのオブジェクトの削除は期待どおりに機能します。編集:申し訳ありませんが、話が早すぎました。実際には「手書きの」ループではありません。プロジェクトを編集して、手書きのループを削除しています。これは実際にはfind_ifアルゴリズムと手動削除を使用しますが、問題は有効になるまでです。/編集。
typedef vector<Media *>::iterator v_iter;
..。 void Database :: removeById(int id){ v_iter it = find_if(v_.begin()、v_.end()、Comparer(id)); if(it!= v_.end()){ 消して; v_.erase(it); } }
これはかなり自明のはずです。パラメータに一致するIDが見つかった場合、ファンクターはtrueを返し、オブジェクトは破棄されます。これは機能し、valgrindはメモリリークを報告しませんが、STLを使用したいので、明らかな解決策は、erase-removeイディオムを使用することです。
void Database :: removeById(int id){ v_.erase(remove_if(v_.begin()、v_.end()、Comparer(id))、v_.end()); };
ただし、これは「機能」しますが、valgrindによるとメモリリークが発生します。最初のバージョンはリークなしで正常に動作しますが、このバージョンでは、削除するすべてのメディアオブジェクトに対して「解放されていない」3つの割り当てが常に表示されます。