読者です 読者をやめる 読者になる 読者になる

EffectiveC++ 改訂2版を読み始める

C++ EffectiveC++

本棚に埋もれていた第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項が関連しそうなので、先送り。