Как я могу запретить использование «нового» в определенных частях кода C ++? - PullRequest
2 голосов
/ 06 июля 2011

Можно ли предотвратить использование новых в определенных точках кода?

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

Если бы я начинал разработку с нуля, я мог бы написать свою собственную обертку и использовать ее или перегрузить оператор new в общем базовом классе.

Есть ли способ перегрузить глобальное новое и затем вызвать его?

Ответы [ 3 ]

5 голосов
/ 06 июля 2011

Нет, вы не можете «перегрузить» глобальный new - только заменить его . Однако в вашей замене вы можете проверить глобальный флаг, означающий «разрешено новое» (и выдать исключение, если этот флаг не установлен), и изменить этот флаг изнутри вызывающего кода. Это не поможет против перегруженных operator new в классах, если вы не измените каждую перегрузку, чтобы также уважать этот флаг.

2 голосов
/ 06 июля 2011

Не Перегрузка , но Замена новым глобально действительно возможно.

Стандарт C ++ имеет набор предопределенных операторов new и delete. Наиболее часто используемые версии:

void* operator new(std::size_t) throw(std::bad_alloc); 
void  operator delete(void*) throw(); 
void* operator new[](std::size_t) throw(std::bad_alloc);  
void  operator delete[](void*) throw();

Первые две версии выделяют и освобождают память для объекта, последние две - для массива объектов.

Если вы предоставляете собственные версии, они называются и заменяют версии из стандартной библиотеки.

Если вы перегрузите оператор new, вы всегда должны также перегрузить соответствующий оператор delete, даже если он никогда не вызывается и не используется вами.

0 голосов
/ 05 сентября 2013

Вы, вероятно, можете попробовать:

#define new new(your imagination)

и позже отмените его зависит от вашей ситуации

...