2011-07-28 3 views
5

私のプロジェクトでは、抽象基底クラス "Base"を使用しています。 "Base"から派生したオブジェクトの動的割り当て/割り当て解除のすべてを追跡したいと思います。この目的のために、私は "Base"の新しい/削除演算子をオーバーライドしました。オブジェクト構築時に最も派生した型を取得する

オーバーライドされたnew演算子でメモリを正常に割り当てた後、割り当ての最も派生した型とそのサイズを使用して、メモリを追跡するために使用しているオブジェクトに通知したいと思います。サイズは問題ではありません( "Base"の新しい演算子に直接渡されるため)が、最も派生した型を取得することは問題です。

私はそれをやろうとしている方法ではこれが不可能だと思うことに傾いています。オブジェクトのより多くの派生部分がまだ構築されていないので、それらが何であるかを知る方法がありません。しかし、「ベース」クラスのオーバーロードされた新しい演算子は、最終的な製品について何かを知っています。サイズについては、他のことを知ることが可能ですか?コンテキストの場合

newオペレータはメモリだけで、何よりもの割り当てを行うよう

void* Base::operator new(size_t size) 
{ 
    void* storage = malloc(size); 

    if (storage == NULL) 
     throw std::bad_alloc(); 

    // Notify MemoryTracker an allocation has occurred 
    // MemoryTracker::Instance().Allocate(type, size); 

    return storage; 
} 
+3

+1これは 'operator new'を使っては可能ではないと私は信じていますが、私はそれを証明できません。私は、C++言語の機能についてもう一度間違っていることが証明されるかどうかを知りたいのです。 :-) – templatetypedef

答えて

2

そうだね、それは、この方法ではできません。そのようなことを行う正しい場所は、アロケータではなく、RTTIを使用してビルドされたオブジェクトの型を判断できるようにする必要があります(したがって、すべての子クラスコンストラクタではなくBaseコンストラクタで実行できます)。

+6

RTTIは、その時点で基本クラスのvtableを指すように初期化されるvtableポインタに基づいて動作するため、基本クラスのコンストラクタでは完全に機能しません。 – unkulunkulu

+0

完全に構築される前に、オブジェクトの最も派生した型を知ることは今まで可能であると思われます。 – Wells

+0

@ウェルズ:いいえ、そうではありません。基本クラスコンストラクタは、派生コンストラクタの前に呼び出されます。 –

2

C++用のGC実装を勉強したときに私が学んだのは、このためのトリックです。欠点は、新しいマクロの代わりにマクロを使用する必要があることです。

+0

恐ろしい。ありがとう。 – Wells

関連する問題