カスタムメモリトラッキング(リーク防止、破損検出)を行うには、新しい配置を使用してC ++オブジェクトを作成する必要があります。これは正常に機能しますが、コンストラクターに引数を渡す方法を理解するのに苦労しています。マクロから呼び出されるため(ファイル+行を自動的に提供できるように)。
関数:
template <typename T>
T*
cpp_new(
const char *file,
size_t line
)
{
T *n = (T*)tracked_allocate(&memory_context, sizeof(T), file, line);
if ( n )
{
construct(n);
}
else
{
throw std::bad_alloc();
}
return n;
}
これは、マクロを介して呼び出されます。
#define new_object(type) cpp_new<type>(__FILE__, __LINE__)
新規配置:
template <typename T>
void
construct(
T *obj
)
{
obj = new (obj) T;
}
va_listマクロは、可変数の引数の拡張をカバーしますが、コンストラクターが持つ引数の数を指定したくない場合は、va_arg()を削除し、va_start()を使用できません。これは、フォーマットを想定しているためです。
これは私の頭を少し超えました:http ://www.drdobbs.com/cpp/calling-constructors-with-placement-new/232901023?pgno = 2
__VA_ARGS__
new_objectから使用して、それらを構築関数に渡す方法はありますか?各オブジェクトにはコンストラクターが1つしかありませんが、さまざまなパラメーターを使用するさまざまなタイプのオブジェクトがあるため、手動によるメンテナンスを可能な限り削除したいと思います。
それとも、私が試みていることを一般的に行うためのより良い方法がありますか?