Я создаю детектор утечки памяти для C++. Он заменяет глобальный новый оператор и использует макрос инициализирует две глобальные переменные, __file__
и __line__
, например, так:redefine __LINE__ и __FILE__ константы
#define new (__file__=__FILE__,__line__=__LINE__) && 0 ? NULL : new
Я узнал этот трюк от другого пользователя StackOverflow, чье имя я не могу вспомнить. Это отлично работает с простыми операциями, связанными с новыми, однако эта оценка вызывает проблему, когда пользователь определяет локальный оператор, новый для пространства имен. Во-первых, линии, подобные
void* operator new(size_t size);
также соответствует макро; также, явные призывы к глобальным новым, например:
int* i = ::new int;
вызывает синтаксические ошибки.
Есть ли способ переопределить или подавить константы __LINE__
и __FILE__
(чтобы они отображали имя файла и номер строки вызова оператора new) в части кода? Если нет, как можно улучшить макрос, чтобы не соответствовать пользовательскому «оператору нового» и не вызвать проблему с «:: new»?
Я бы очень хотел избавиться от неудобства макросов. Заранее спасибо :)
Именно поэтому определение языка C++ не позволяет создавать макросы, которые переопределяют ключевые слова. –
Назначение новых значений двум глобальным переменным (что, чтобы усугубить использование зарезервированных имен) путем переопределения ключевого слова не будет делать детектор утечки, хотя (если вы не предполагаете, что это всегда последнее утечка). Хотя вы уже используете нестандартные вещи, я бы предпочел вам перегружать глобальные 'operator new' и' delete' с помощью специального распределителя, который запоминает '__builtin_return_address (1)' для каждого распределения. – Damon
@Damon Макрос - это не единственная часть программы, я заменил глобальные новые и удаленные операторы. Информация хранится в связанном списке. – user3109672