Хотя стандартная среда выполнения Microsoft предоставляет отладочную версию функций распределения, на самом деле она не работает, потому что вы не должны использовать голый new в коде C++, поэтому инструментарий указывает на стандартную библиотеку или никуда, потому что стандартная библиотека все равно не может быть инструментирована.
Теперь у меня есть код, который может создавать (и записывать) обратные трассировки выделений, и я также использовал DUMA. Однако попытки заменить функции распределения не удались, когда мы использовали потоки, потому что streambuf
вызывает некоторый вариант отладки и делает это непоследовательно между new и delete.
Итак, есть ли у кого-нибудь опыт замены распределителя путем переопределения функций, а не уродливых трюков с препроцессором, в стандартной среде выполнения Microsoft? Я подозреваю, что это включает в себя избегание распределителя отладки, но я хочу сохранить определение _DEBUG
по очевидным причинам (от него зависит гораздо больше кода отладки).
Примечание. В настоящее время мы застряли на Visual C++ 9.0 (Visual Studio 2008).
Изменить: вряд ли можно избежать распределителя отладки, поскольку стандартная библиотека C++ должна иметь согласованные определения new и delete между функциями и экземплярами, скомпилированными в библиотеку, и экземплярами, сгенерированными в пользовательском коде, поскольку выделение может быть выполнено одним и освобождение другим. Это, кстати, означает, что определение статических встроенных вариантов в принудительно включенном заголовке вряд ли поможет.
Edit2: это невозможно с динамической компоновкой, потому что Windows связывает символы из определенных библиотек DLL, поэтому нет возможности переопределить их во время компоновки. Но динамическое связывание нам не нужно и мы его не используем, потому что основной целью является WinCE, а статическое связывание там по умолчанию.
operator new
иoperator delete
; они жестко связаны с DLL, поэтому вы не можете их заменить. Хитрость заключается в том, чтобы связать статическую библиотеку времени выполнения и предоставить свои собственныеoperator new
иoperator delete
, так что те, что в статической библиотеке, не нужны. Но это работает только для монолитного приложения; это доставит вам неприятности, если вы создадите свои собственные DLL. Добро пожаловать в ад DLL. - person Pete Becker   schedule 10.10.2012/FORCE
) в основном работало, но я помню, что у меня была проблема сstreambuf
, делающей что-то странное. - person Jan Hudec   schedule 11.10.2012