C ++ - оператор перегрузки new и предоставления дополнительных аргументов - PullRequest
7 голосов
/ 31 декабря 2011

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

Например,

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

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

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

...

}

Спасибо

РЕДАКТИРОВАТЬ: Вот что я хочу сделать:

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

1 Ответ

13 голосов
/ 31 декабря 2011

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

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

addenda

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

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

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

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

...