2010-12-19 10 views
4

低レイテンシシステムで作業したい、ヒープ割り当てはアプリケーションでコストがかかります。しかし、ヒープ上のオブジェクトの作成はある程度可能です。オブジェクトが作成されているかどうかの表示が必要な理由は、ヒープにあるかどうかです。オブジェクトの作成がヒープにあるかどうかを知る方法は?

以下の方法は、ヒープメモリ上に作成されたオブジェクトを見つける正しい方法ですか。

はどこ新しいジェネリッククラスを持っており、オペレータがヒープに割り当てられたポインタを維持するためにオーバーロードされ削除させていただきます....我々はヒープの作成のためにチェックする必要があり、エンドユーザクラスの

#include <iostream> 
#include <set> 

using namespace std; 

class MemStat    //base class 
{ 
    typedef set<MemStat*> POINTERS; 
    static POINTERS m_ptrlist; 
public: 
    void* operator new (size_t size) 
    { 
     MemStat* ptr = ::new MemStat; 
     m_ptrlist.insert(ptr); 
     return ptr; 
    } 
    void operator delete(void* dptr) 
    { 
     MemStat* ptr = static_cast<MemStat*>(dptr); 
     m_ptrlist.erase(ptr); 
     ::delete ptr; 
    } 
    // void* operator new[] (size_t sz); 
    // void operator delete[] (void*); 

    bool is_on_heap() { m_ptrlist.find(this) != m_ptrlist.end(); } 

protected:    // ctor & dtor are protected for restrictions 
    MemStat() { } 
    virtual ~MemStat() { } 
    MemStat(const MemStat&) { } 
    const MemStat& operator=(const MemStat&) { return *this; } 
}; 
MemStat::POINTERS MemStat::m_ptrlist; 

が由来されますMemStatクラスは、ベースクラスオブジェクトのインスタンス化中に新しい&オペレータコールを削除します。

class MyClass : public MemStat //end user class 
{ 
}; 

int main() 
{ 
    MyClass* myptr = new MyClass; 
    MyClass obj; 

    cout << myptr->is_on_heap() << endl; //results into yes 
    cout << obj.is_on_heap() << endl;  //reults into no 

    delete myptr; 
} 

答えて

6

あなたのスキームは、すぐMyClassオブジェクトがまたはによって動的に割り当てられていない場合があります別のオブジェクトのサブオブジェクト(継承または含まれている)であるとして無残に失敗することに注意してください。 (そして、私がダイナミックアロケーションを防ぐために知っていることは、そのアロケーションでも失敗します。)

こうすることで、ヒープ割り当てが大幅に遅くなるだけです。オブジェクトが割り当てられている非常にまれな状況を除いて、クラス 'のユーザーはと決まります。
もし彼らがを動的にする必要があると思うなら、を割り当てます。あなたは誰ですか?

+0

また、任意の数のアロケータデバッギングスキームによって、ポインタが正確に一致しなくなります。したがって、 'set'は不適切です。しかし、各割り当てのサイズを格納し、その情報を検索に使用することによって、「this」が割り当てられた領域内にあるかどうかを調べることが可能でなければなりません。コードの可搬性に応じて、ブロック情報を重複して格納するのではなく、基本的なアロケータのヒープウォーキングAPIを使用することができます。 –

関連する問題