С++ - оператор перегрузки new и предоставляет дополнительные аргументы

113
4

Я знаю, что вы можете перегрузить оператор new. Когда вы это сделаете, вам по умолчанию отправляется параметр size_t. Однако можно ли отправить параметр size_t, а также дополнительные параметры, предоставленные пользователем, перегруженному методу оператора new?


Например


int a = 5;
Monkey* monk = new Monkey(a);

Поскольку я хочу переопределить новый оператор следующим образом


void* Monkey::operator new(size_t size, int a)
{

...

}


Спасибо


EDIT: Здесь я хочу выполнить:


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

спросил(а) 2011-12-31T03:47:00+04:00 8 лет, 10 месяцев назад
1
Решение
153

Вызвать новый с этим дополнительным операндом, например


 Monkey *amonkey = new (1275) Monkey(a);

добавлений


Практический пример передачи аргумента [s] вашему оператору new дается сборщик мусора Boehm, который позволяет вам кодировать

 Monkey *acollectedmonkey = new(UseGc) Monkey(a);

и вам не нужно беспокоиться о delete -ing acollectedmonkey (предполагая, что его деструктор не делает странных вещей, см. этот ответ), Это редкие ситуации, когда вы хотите передать явный аргумент Allocator в коллекции шаблонов, например std::vector или std::map.


При использовании пулов памяти часто требуется иметь класс MemoryPool и передавать экземпляры (или указатели на них) этого класса в ваши new и ваши операции delete . По соображениям удобочитаемости я не рекомендую ссылаться на пулы памяти каким-то неясным целым числом.

ответил(а) 2011-12-31T03:50:00+04:00 8 лет, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема