EffectiveC++ 改訂2版を読み始める
本棚に埋もれていた第2版をこれまでの復習を兼ねて読み始める。
第3版に比べ、Cからの移行の章があったりして時代を感じさせますね。こちら側が丁度良い位なのが淋しいですが。
1項から7項
このあたりはすいすい読み進められる。
8項
非メンバ、メンバのnew/deleteを作成するときの話。
- 非メンバ operator new では0バイトの要求への対応が必要
- 非メンバ operator delete は簡単
- メンバ operator new では渡されたサイズと自クラスのサイズとの比較が必要
- メンバ operator delete では渡されたサイズと自クラスのサイズとの比較が必要
と、ここまで良いのだが、メンバの配列版を作ってみたらVC2005とg++とで動きが違う。
次のソースで実行してみる。
#include <iostream> class TestClass { public: TestClass(): data(0) { std::cout << "def-const\n"; } static void * operator new(size_t size) { std::cout << "new(" << size << ")\n"; return ::operator new(size); } static void * operator new[](size_t size) { std::cout << "new[" << size << "]\n"; return ::operator new(size); } static void operator delete(void *ptr, size_t size) { std::cout << "delete(" << size << ")\n"; ::operator delete(ptr); } static void operator delete[](void *ptr, size_t size) { std::cout << "delete[" << size << "]\n"; ::operator delete[](ptr); } private: int data; }; int main() { TestClass *p = new TestClass; delete p; TestClass *pn = new TestClass[5]; delete[] pn; }
VC2005の実行例
new(4) def-const delete(4) new[20] def-const def-const def-const def-const def-const delete[4]
g++の実行例
new(4) def-const delete(4) new[24] def-const def-const def-const def-const def-const delete[24]
VC2005で new/delete に渡されてくるサイズが異なるのが疑問。
タイトルだけ見ると10項が関連しそうなので、先送り。