Есть ли способ получить размер одного элемента или количество элементов, выделенных с помощью оператора 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 ++ на основе этого.
Object
учебный класс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;
}
Конструктор Object
использует эту информацию:
Object::Object()
{
if ((void*)referenceCount != this)
{
referenceCount = -1; //stack object no reference counting
}
else
{
referenceCount = 1; //heap object count references
}
}
referenceCount
поле для работы.Теперь мне нужно реализовать operator new[](size_t)
установить referenceCount
и именно поэтому мне нужен размер одного элемента или количество элементов. Impelenting operator new[](size_t)
для каждого объекта не может быть и речи.
Есть идеи?
Это кажется очень Java-esque для меня. Будет ли проще просто написать свою программу на Java? Любой, кому придется поддерживать ваш код C ++ в будущем, оценит это, если вы начнете использовать идиоматический C ++. Например, используйте умные указатели для управления вашей памятью, а не пытайтесь реализовать сборку мусора на основе всего, что наследуется от Object
,
Я должен отметить, что вы не указали «множественное наследование запрещено» из вашего списка условий, потому что при наличии множественного наследования ваше приведение сырой неинициализированной памяти к Object*
может не выполнить настройки указателя, необходимые для доступа к правильному адресу referenceCount
,
Дополнительно, если память referenceCount
случается, чтобы держать адрес на основе стека Object
При построении ваш код будет считать, что он выделен в куче, и в конечном итоге вы получите UB, когда вы удалите указатель стека.
Но после всего этого, если вы еще на самом деле действительно очень хочу это сделать, я думаю, что ваш единственный вариант — использовать CRTP для автоматического внедрения оператора new массива в каждый дочерний класс. По крайней мере, так вам не нужно писать это для каждого ребенка.
Других решений пока нет …