在我的项目中,我有一个抽象基类“Base”。我想跟踪从“Base”派生的所有对象的动态分配/解除分配。为此,我在“Base”中重写了新的/删除操作符。
在重写的new运算符中成功分配内存后,我想通知我用于跟踪已发生分配的内存的对象,具有最大的派生类型及其大小。大小不是问题(因为它直接传递给“Base”的新运算符),但是获得最多派生类型是一个问题。
我倾向于认为这是不可能的,因为我正在尝试这样做。由于尚未构建对象的更多派生部分,因此无法知道它们是什么。但是,“Base”类重载的新运算符知道最终产品的大小 - 大小 - 所以有可能知道其他任何相关内容吗?
上下文:
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;
}
答案 0 :(得分:2)
你是对的,这种方式是不可能的,因为new
运算符只是分配内存,仅此而已。执行此类操作的正确位置是构造函数,而不是分配器,您应该能够使用RTTI来确定构建对象的类型(因此可以在Base
构造函数中完成,而不是在每个子类构造函数中完成)。
答案 1 :(得分:2)
我在学习C ++的GC实现时学到了一些技巧。缺点是你必须使用宏而不是普通的新。
struct base {
void *operator new(size_t sz) {
// ...
}
};
struct init_tag {};
base * operator % (init_tag, base *ptr) {
// just do what you like here...
return ptr;
}
#define gc_new init_tag() % new