为了进行一些自定义内存跟踪(泄漏预防、损坏检测),我不得不使用placement new 来创建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 使用并将它们传递给构造函数?每个对象只有一个构造函数,但有许多不同类型的对象采用不同的参数,所以我想尽可能多地去除手动维护。
还是有更好的方法来做我正在尝试的事情!