|
/*========================================================*/ <<<あゆしゃのC言語プログラミング>>> /*========================================================*/ 第567回 ガベージコレクタ5 削除処理 発行 2005年5月30日(月曜日) 発行数 約2600 {magclick} /*========================================================*/ はじめに ( 決り文句 ) /*========================================================*/ ・このメールマガジンは、主にまぐまぐさんから発行しています。 ・ジャンルは、マルチメディアのプログラム、C言語です。 ・横60文字で作成し、インデントは大抵半角スペース4つです。 ・ここで扱うプログラムは、C言語と半光年以内のものです。 ・登録解除は、メルマガのホームページでお願いします。 ・過去ログはバックナンバー(下欄参照)を活用して下さい。 ・内容は私が感じたもので、最新の技術も、へたれもあります。 ・わかりやすさを優先させる為、たまに嘘があるかもしれません。 ・セキュリティ突破のため、暗号化された単語があります。 /*========================================================*/ ご挨拶 /*========================================================*/ こんにちは。あゆしゃです。 今月のCマガジンにて、円周率を求めるアルゴリズムが紹介され ていました。 大型計算機に組み込めるでしょうか? {magclick} /*========================================================*/ 今回のお題 << ガベージコレクタ5 削除処理 >> /*========================================================*/ グラフィックソフト「キャラエディッタ」を作るべく、それに 必要となる「座標変換」を専用に扱う処理として、ヒステリシス を作りました。 ヒステリシスにおいて、テンプレートの話があがり、それを きっかけにテンプレートの話に暴走してしまいました。 そして本来のキャラエディッタには関係のないものをいろいろ 作ってしまいました。 その余談も、今回で終了です。 /*========================================================*/ 自作版「ガベージコレクタ」において最も重要な処理である、 削除について考えます。 削除をするタイミングは、CGarbage のデストラクタです。 class CGarbage { public: virtual ~CGarbage() { Delete(); } void Delete() { CGarbageList* p; while( m_list ) { p = m_list->prev; delete m_list; m_list = p; } } }; 難しいことはありません、線形検索して片っ端から削除します。 リスト構造において、デストラクタで prev(またはnext)を 削除すれば、結果的には同じですが、呼び出しが煩雑になるので、 ループで処理できるところはループで処理します。 Deleteを抜けた後、m_listはNULLとなります。 /*========================================================*/ データを削除するのは、CGarbageData のデストラクタです。 これは呼び出しがループにならないので、素直にデストラクタに 記述します。 template <class DataType> class CGarbageData { public: virtual ~CGarbageData() { if( m_data ) delete[] m_data; } }; デストラクタなので、deleteのポインタをNULLに戻す必要は ありません。 /*========================================================*/ デストラクタは、必ずバーチャルで宣言します。 おまじないだと思ってください。 {magclick} /*========================================================*/ さいごに /*========================================================*/ これで、削除について考える必要のない処理が作成できた、 はずです。 次のアプリにおいて、ヒステリシスは使いますが、ガベージ コレクタは果たして使うでしょうか。 考え中です。 {magclick} /*========================================================*/ 次回予告 /*========================================================*/ 次回は6月2日(水曜日)に、第568回をお送りします。 お題は「キャラエディッタ1 概要」 グラフィックエディッタの作成に入ります。 お楽しみに! /*========================================================*/ 最後の決り文句 /*========================================================*/ このメールマガジンは、まぐまぐさんから発行しています。 このメールマガジンを解除したい場合は、まぐまぐさんをご利用 ください。このメルマガのまぐまぐアイディーは最後にあります。 このメールマガジンには広告が挿入されていますか? このメールマガジンの内容に文面の引用はありませんか? めーらっくすの場合はめーらっくすの利用方に従ってください。 このメールマガジンの内容の、転用、流用、宣伝、リンク、 3.1415926535897まで暗記 なんて大歓迎です。 {magclick} /*========================================================*/ /*========================================================*/ 発行者 あゆしゃ ホームページ::あゆしゃの世界 http://ayusya.hp.infoseek.co.jp/ ご意見・ご感想・ご質問メール mailto:ayusya@flamenco.plala.or.jp まぐまぐ::アイディー 0000020674 まぐまぐ::登録と解除 http://www.mag2.com/m/0000020674.htm まぐまぐ::バックナンバー http://jazz.tegami.com/backnumber/frame.cgi?id=0000020674 めーらっくす::アイディー MM3E1AEE285AB4F めーらっくす::登録と解除 http://www.mailux.com/mm_dsp.php?mm_id=MM3E1AEE285AB4F めーらっくす::バックナンバー★最近のものならこちらが便利★ http://www.mailux.com/mm_bno_list.php?mm_id=MM3E1AEE285AB4F |