object — получить размер отдельного элемента или количество элементов, выделенное с помощью оператора new []

Есть ли способ получить размер одного элемента или количество элементов, выделенных с помощью оператора new []?

Что я имею в виду:

void* Object::operator new[](size_t size)
{
void *temp = ::operator new(size);

//Get size of single element or count of elements being allocated

return temp;
}

Зачем мне это нужно:

operator new(size_t) а также operator new[](size_t) Вызываются только тогда, когда объект размещен в куче, поэтому у меня есть идея создать сборку мусора в c ++ на основе этого.

  1. Все объекты наследуются от Object учебный класс
  2. Object переопределения класса operator new(size_t) а также operator new[](size_t)как это:

    void* Object::operator new(size_t size)
    {
    Object& result = *static_cast<Object*>(::operator new(size));
    result.referenceCount = (int)&result;
    return &result;
    }
    
  3. Конструктор Object использует эту информацию:

    Object::Object()
    {
    if ((void*)referenceCount != this)
    {
    referenceCount = -1; //stack object no reference counting
    }
    else
    {
    referenceCount = 1; //heap object count references
    }
    }
    
  4. Пользователь сборщика мусора referenceCount поле для работы.

Теперь мне нужно реализовать operator new[](size_t) установить referenceCount и именно поэтому мне нужен размер одного элемента или количество элементов. Impelenting operator new[](size_t) для каждого объекта не может быть и речи.

Есть идеи?

3

Решение

Это кажется очень Java-esque для меня. Будет ли проще просто написать свою программу на Java? Любой, кому придется поддерживать ваш код C ++ в будущем, оценит это, если вы начнете использовать идиоматический C ++. Например, используйте умные указатели для управления вашей памятью, а не пытайтесь реализовать сборку мусора на основе всего, что наследуется от Object,

Я должен отметить, что вы не указали «множественное наследование запрещено» из вашего списка условий, потому что при наличии множественного наследования ваше приведение сырой неинициализированной памяти к Object* может не выполнить настройки указателя, необходимые для доступа к правильному адресу referenceCount,

Дополнительно, если память referenceCount случается, чтобы держать адрес на основе стека Object При построении ваш код будет считать, что он выделен в куче, и в конечном итоге вы получите UB, когда вы удалите указатель стека.

Но после всего этого, если вы еще на самом деле действительно очень хочу это сделать, я думаю, что ваш единственный вариант — использовать CRTP для автоматического внедрения оператора new массива в каждый дочерний класс. По крайней мере, так вам не нужно писать это для каждого ребенка.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]