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

Библиотека времени выполнения 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 вручную?

6

Решение

#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")
6

Другие решения

Исторически я решил эту проблему, используя предварительно скомпилированные заголовки и делая что-то вроде этого (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__)

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

3

Я знаю, что это немного поздно, но эту проблему можно решить с помощью магии шаблонов.

В последнее время я кодирую отладчик debug_new, который добавляет новое ключевое слово «размещение», которое записывается перед всеми новыми вызовами размещения.

Вы можете проверить мой отладчик здесь: https://sourceforge.net/projects/debugnew/

Или отладчик debug_new от nvwa здесь: https://sourceforge.net/projects/nvwa/

0

Вся эта вещь DEBUG_NEW должна умереть в огне! Это было только когда-то едва полезным и вообще не полезно в современном C ++, потому что вы больше не видите new в здравом уме C ++.

Были лучшие варианты, такие как DUMA, и теперь, когда есть Доктор памяти (который работает аналогично Valgrind, но в Windows) абсолютно бессмысленно использовать мерзость DEBUG_NEW.

0

define new DEBUG_NEW строка должна быть помещена в исходные файлы, после всех строк #include. Таким образом, он применяется только к вашему собственному коду и не применяется ни к каким другим h-файлам, таким как Boost. Глобальное новое перенаправление в DEBUG_NEW может привести к сбою компиляции, и его следует избегать.

-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector