C++相談室 part89

このエントリーをはてなブックマークに追加
697デフォルトの名無しさん
すいません。new/delete でご意見をきかせてください。

コードはこちらです。http://www.amazon.co.jp/dp/4797327030/ の最初の Iterator パターンを C++ で書き直したものです。
http://codepad.org/hrU82H5x

ここでは、new/delete 忘れを検出するべく、new/delete をオーバーロードして malloc()/free() に振りなおしています。
さらに、malloc()/free() に対しては、xmalloc()/xfree() なるラッパを間に通しており、最終的に malloc()/free() 忘れや二重解放を拾い上げられるようにしています。
ラッパの実装は双方向リストを使用しています。
#宿題スレでよく使用しておりお見かけの方がおられるかもしれません。

ここで次のような事態が発生しました。解放忘れや二重解放はなんとか排除できたのですが、
※「クラスのスタティックなメンバ関数としての new で確保した領域が、グローバル関数として定義した delete で解放されている」
処理系によってはそういうことがある、と考えていいのでしょうか?それとも書きように問題が残っているのでしょうか。

---
上のソースでは、
278行目 Iterator<Book> *itr = bookShelf->iterator(); //(a)
233行目 Iterator<T> *iterator(); //(b);
269行目 return new ConcreteIterator<T>(this); //(c)
の道筋で最終的に確保された動的領域を、
283行目 delete itr; //(d)
で解放したのですが、実行結果を見る限り、これは、
136行目の void operator delete(void *p) {
にきているようです。

こちらの環境/処理系は gcc 4.3.4 / cygwin on Windows XP です。
ご意見をお聞かせいただければ幸いです。よろしくお願いいたします。