C++ 在对象构造期间获取最多派生类型
在我的项目中,我有一个抽象基类“base”。我希望跟踪从“Base”派生的对象的所有动态分配/解除分配。为此,我覆盖了“Base”中的new/delete操作符 在重写的new操作符中成功分配内存后,我想通知我用于跟踪内存的对象,分配已经发生,并且具有最派生的分配类型及其大小。大小不是问题(因为它直接传递给“Base”的新操作符),但是获取最多的派生类型是一个问题 我倾向于认为这是不可能的,因为我试图这样做。由于对象的更多派生部分尚未构建,因此无法知道它们是什么。然而,“基类”重载的新操作符知道一些关于最终产品的信息——大小——那么有可能知道关于它的其他信息吗 上下文:C++ 在对象构造期间获取最多派生类型,c++,memory-management,C++,Memory Management,在我的项目中,我有一个抽象基类“base”。我希望跟踪从“Base”派生的对象的所有动态分配/解除分配。为此,我覆盖了“Base”中的new/delete操作符 在重写的new操作符中成功分配内存后,我想通知我用于跟踪内存的对象,分配已经发生,并且具有最派生的分配类型及其大小。大小不是问题(因为它直接传递给“Base”的新操作符),但是获取最多的派生类型是一个问题 我倾向于认为这是不可能的,因为我试图这样做。由于对象的更多派生部分尚未构建,因此无法知道它们是什么。然而,“基类”重载的新操作符知道
void*Base::运算符新建(大小)
{
void*存储=malloc(大小);
if(存储==NULL)
抛出std::bad_alloc();
//通知MemoryTracker发生分配
//MemoryTracker::Instance().Allocate(类型、大小);
返回存储;
}
你说得对,这样做是不可能的,因为new
操作符只是分配内存而已。正确的地方是构造函数,而不是分配器,在这里你应该能够使用RTTI来确定构建对象的类型(因此它可以在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
+1我不相信使用
运算符new
可以做到这一点,但我无法证明这一点。我很好奇,想看看我是否会被证明是错误的,关于C++语言的特性。RTTI不应该在基类构造函数中完全工作,因为它是基于vtable指针操作的,该指针被初始化为指向基类的vtable。这似乎是真的-在完全构造对象之前,是否有可能知道对象的最派生类型?@Wells:不,不是。基类构造函数在派生构造函数之前被调用。好的,非常感谢。看来这次我得回到画板上去了。