繁体   English   中英

在对象构造期间获取最多派生类型

[英]Getting most derived type during object construction

在我的项目中,我有一个抽象基类“Base”。 我想跟踪从“Base”派生的所有对象的动态分配/解除分配。 为此,我重写了“Base”中的new / delete运算符。

在重写的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;
}

你是对的,这种方式不可能,因为new操作员只分配内存,仅此而已。 执行此类操作的正确位置是构造函数,而不是分配器,您应该能够使用RTTI来确定构建对象的类型(因此可以在Base构造函数中完成,而不是在每个子类构造函数中完成)。

在研究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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM