Что такое использование DEBUG_NEW и __FILE__? - PullRequest
6 голосов
/ 24 марта 2011

Я видел следующие макросы,

#ifdef _DEBUG
#define new DEBUG_NEW
#UNDEF THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

Какое использование выше макроса?

Спасибо

Ответы [ 5 ]

7 голосов
/ 24 марта 2011

DEBUG_NEW - это просто MACRO, который обычно определяется как:

#define DEBUG_NEW new(__FILE__, __LINE__)
#define new DEBUG_NEW

Так что, где бы вы ни использовали new, он также может отслеживать файл и номер строки, которые могут быть использованы для определения местоположения памятиутечка в вашей программе.

И __FILE__, __LINE__ - это предопределенные макросы , которые оценивают имя файла и номер строки соответственно там, где вы их используете!

Читатьследующая статья, которая объясняет технику использования DEBUG_NEW с другими интересными макросами, очень красиво:

кросс-платформенный детектор утечки памяти


из Википедия,

Debug_new относится к технике в C ++ для перегрузки и / или переопределения оператора new и оператора delete для перехвата вызовов выделения и освобождения памяти и, таким образом, отладки программы для использования памяти, Это часто включает определение макроса с именем DEBUG_NEW и превращение нового в нечто новое (_ FILE _, _ LINE _) для записи информации о файле / строке при выделении. Microsoft Visual C ++ использует эту технику в своих классах Microsoft Foundation.Есть несколько способов расширить этот метод, чтобы избежать использования переопределения макросов, но при этом отображать информацию о файлах / строках на некоторых платформах.Есть много присущих этому методу ограничений.Он применяется только к C ++ и не может улавливать утечки памяти функциями C, такими как malloc.Тем не менее, он может быть очень простым в использовании и очень быстрым по сравнению с некоторыми более полными решениями отладчика памяти.

1 голос
/ 24 марта 2011

_DEBUG - произвольно названный, но часто выбираемый символ командной строки, который указывает, что необходимо компилировать дополнительный код и поддержку для отладки программы. Часто это вызывает дополнительные проверки, помогающие изолировать программные недостатки, или вызывает дополнительные сообщения длябыть выводом для блага разработчика.

DEBUG_NEW не ясно, но, вероятно, это псевдоним для new(), который выполняет дополнительную проверку, связанную с new() и delete().

__FILE__ - это встроенный символ препроцессора, который оценивает имя файла компилируемого модуля.Например, «MyProgram.cc».

0 голосов
/ 27 августа 2016

Обычно эта комбинация макросов и команд препроцессора используется в проектах MFC для отслеживания утечек памяти. Он должен быть включен в ваш исходный файл, и literraly означает следующее:

Все между #ifdef _DEBUG и #endif выполняется только в режиме отладки вашего компилятора.

Строка: #define new DEBUG_NEW, означает, что всякий раз, когда вы используете оператор новый в своем коде, он будет заменен макросом DEBUG_NEW. И затем, когда вы делаете дамп объекта, DEBUG_NEW позволит вам точно определить источники утечек памяти.

Строки: #UNDEF THIS_FILE и static char THIS_FILE[] = __FILE__; - переопределить значение THIS_FILE и запомнить текущее имя файла и номер строки.

0 голосов
/ 24 марта 2011

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

См. Обсуждение здесь:

Есть ли способ автоматически воспроизводить #define в каждом исходном файле

0 голосов
/ 24 марта 2011

Одно из распространенных применений __FILE__ - разработка функций регистрации ошибок.Вы можете использовать __FILE__ и __LINE__ вместе, чтобы сообщить точное местоположение исходного кода, где произошла ошибка.

Я разработал библиотеки исключений и функции assert(), которые регистрируют эту информацию.Одно такое использование задокументировано здесь .

РЕДАКТИРОВАТЬ: Другой пример здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...