低レイテンシシステムで作業したい、ヒープ割り当てはアプリケーションでコストがかかります。しかし、ヒープ上のオブジェクトの作成はある程度可能です。オブジェクトが作成されているかどうかの表示が必要な理由は、ヒープにあるかどうかです。オブジェクトの作成がヒープにあるかどうかを知る方法は?
以下の方法は、ヒープメモリ上に作成されたオブジェクトを見つける正しい方法ですか。
はどこ新しいジェネリッククラスを持っており、オペレータがヒープに割り当てられたポインタを維持するためにオーバーロードされ削除させていただきます....我々はヒープの作成のためにチェックする必要があり、エンドユーザクラスの
#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;
}
また、任意の数のアロケータデバッギングスキームによって、ポインタが正確に一致しなくなります。したがって、 'set'は不適切です。しかし、各割り当てのサイズを格納し、その情報を検索に使用することによって、「this」が割り当てられた領域内にあるかどうかを調べることが可能でなければなりません。コードの可搬性に応じて、ブロック情報を重複して格納するのではなく、基本的なアロケータのヒープウォーキングAPIを使用することができます。 –