2016-09-09 4 views
0

Я реализую процесс распределения пользовательской памяти и глобально переопределяю новый, новый [] и удаляю, удаляю []. Распределение памяти принимает размер объекта и необязательный параметр «nObjects», где его количество объектов должно быть создано (по умолчанию - 1).Доступ к номеру, переданному в новый [] C++

Новые работы отлично, но с новым значением [] значение size_t просто возвращает общее значение nObjects * sizeOfObject. Поэтому у меня нет способа узнать количество объектов, которые действительно выделяются, просто размер.

Я смотрел в сборке, и количество объектов, безусловно, там, но меня спрашивает: есть ли безопасный способ доступа к нему в рамках глобального нового [] переопределения?

Спасибо.

EDIT:

Btw, я создаю пользовательские распределения так, что любой другой класс, который создается с ним не нужно делать ничего лишнего, чтобы учесть распределение памяти. например. Я могу просто создать класс any {} и выделить его, мне не нужно выводить его из чего-либо или добавлять что-либо лишнее в его конструктор/деструктор.

Причина, по которой я делаю это, слишком объясняет некоторые внешние применения нового, что у меня нет контроля над другими, кроме глобального переопределения.

+3

Примечание: новое выражение вызывает два вызова: 1) распределение памяти с новым оператором. 2) построение объекта (объектов). Вы не должны заботиться о втором в своих пользовательских операциях new. –

+0

Я сомневаюсь иначе [это] (http://stackoverflow.com/questions/3868962/how-do-you-get-the-size-of-array-that-is-passed-into-the-function) будет менее проблематичным. – NathanOliver

+0

... см. Также http://en.cppreference.com/w/cpp/language/new –

ответ

1

Есть ли безопасный способ доступа к нему в рамках глобального нового [] переопределения?

Нет такого пути.

newoperators - это всего лишь функции распределения памяти, они получают только количество байтов, которые им нужно выделить (точно так же, как malloc).

Это new expression, который принимает количество объектов, вызывает operator new (который вы можете перегрузить), а затем вызывает конструктор. новое выражение не может быть перегружено.

Смежные вопросы