Библиотека времени выполнения Microsoft предоставляет отладочную версию функций выделения. Для C ++ это отладочный вариант оператора new с подписью:
void *operator new(size_t size, int blockType, const char *filename, int linenumber);
и макрос определяется как
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
Теперь, чтобы инструмент все распределения, один обычно определяет
#if defined DEBUG_NEW
#define new DEBUG_NEW
#endif
Однако это определение нарушает любое место, которое использует размещение new, потому что два набора аргументов заканчиваются ошибкой синтаксиса. Теперь я легко справлюсь с несколькими вариантами использования в нашем коде, но стандартная библиотека и расширенное использование новых мест повсеместно. Таким образом, определение этого в глобальном масштабе означает включение большого количества материала перед определением, что замедляет компиляцию.
Так будет ли какой-либо способ распределять инструментальные средства в нашем коде без добавления заголовков только потому, что они содержат размещение новых и без необходимости помещать последнее определение выше во всех файлах или писать DEBUG_NEW вручную?
#pragma push_macro("new")
#undef new
new(pointer) my_class_t(arg1, arg2);
#pragma pop_macro("new")
или же
#pragma push_macro("new")
#undef new
#include <...>
#include <...>
#include <...>
#pragma pop_macro("new")
Исторически я решил эту проблему, используя предварительно скомпилированные заголовки и делая что-то вроде этого (StdAfx.h, Pch.h, PreCompiled.h или что-то еще):
//First include all headers using placement new
#include <boost/tuple/tuple.hpp>
#include <vector>
#define new MY_NEW
#define MY_NEW new(__FILE__, __LINE__)
И затем убедитесь, что файлы не содержат заголовки повышения напрямую, а только предварительно скомпилированный заголовок.
Я знаю, что это немного поздно, но эту проблему можно решить с помощью магии шаблонов.
В последнее время я кодирую отладчик debug_new, который добавляет новое ключевое слово «размещение», которое записывается перед всеми новыми вызовами размещения.
Вы можете проверить мой отладчик здесь: https://sourceforge.net/projects/debugnew/
Или отладчик debug_new от nvwa здесь: https://sourceforge.net/projects/nvwa/
Вся эта вещь DEBUG_NEW должна умереть в огне! Это было только когда-то едва полезным и вообще не полезно в современном C ++, потому что вы больше не видите new
в здравом уме C ++.
Были лучшие варианты, такие как DUMA, и теперь, когда есть Доктор памяти (который работает аналогично Valgrind, но в Windows) абсолютно бессмысленно использовать мерзость DEBUG_NEW.
define new DEBUG_NEW
строка должна быть помещена в исходные файлы, после всех строк #include. Таким образом, он применяется только к вашему собственному коду и не применяется ни к каким другим h-файлам, таким как Boost. Глобальное новое перенаправление в DEBUG_NEW может привести к сбою компиляции, и его следует избегать.