Получение наиболее производного типа при построении объекта - PullRequest
5 голосов
/ 28 июля 2011

В моем проекте у меня есть абстрактный базовый класс "Base".Я хотел бы отследить все динамические распределения / освобождения объектов, которые происходят от "Base".С этой целью я переопределил операторы new / delete в «Base».

После успешного выделения памяти в переопределенном операторе new, я хотел бы уведомить объект, который я использую для отслеживания памяти, чтопроизошло распределение, с наиболее производным типом распределения и его размером.Размер не является проблемой (так как он передается непосредственно в новый оператор для «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;
}

Ответы [ 2 ]

2 голосов
/ 09 октября 2011

Для этого я научился при изучении реализаций GC для C ++. Недостатком является то, что вы должны использовать макрос вместо простого нового.

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
2 голосов
/ 28 июля 2011

Вы правы, это невозможно, так как оператор new просто выделяет память, не более того.Правильное место для такой вещи - конструктор, а не распределитель, где вы должны иметь возможность использовать RTTI для определения типа построенного объекта (и, следовательно, это можно сделать в конструкторе Base, а не в каждом конструкторе дочернего класса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...