Применение MemDumperValidator в приложениях С
Можно задать вопрос — почему я занимаюсь поддержкой языка С? Ответ прост: многие программные продукты, с которыми мы работаем, еще используют С-коды. И, хотите верьте, хотите — нет, некоторые из этих приложений и модулей тоже располагаются в памяти.
Чтобы использовать MemDumperValidator в С-приложении, необходимо придерживаться определенной последовательностью действий. Во-первых, нужно объявить DVINFO-структуру для каждого типа памяти, который вы хотите контролировать через вывод дампа и проверку корректности. В C++ соответствующий макрос автоматически объявляет методы дампов и проверок корректности, но в С следует самостоятельно выполнить некоторую дополнительную работу. Имейте в виду, что все макросы, о которых здесь идет речь, используют указатель на конкретные DVINFO-структуры. Прототипы С-функций вывода дампов и проверки корректности — те же, что и у соответствующих методов в C++, за исключением того, что ключевое слово static в них не используется. Объявления DVINFO-структур для специфических блоков памяти и определения всех С-функций вывода дампов и проверки корректности удобно размещать в объединенном файле. Перед началом конкретных операций работы с памятью1нужно сообщить расширению MemDumperValidator о подтипах используемых клиентских блоков и их функциях вывода дампов и проверки корректности. Всю эту информацию следует передавать в MemDumperValidator с помощью макроса INITIALIZE_MEMDEBUG, который принимает в качестве параметров' соответствующую DVINFO-структуру, функцию вывода дампа и функцию проверки корректности. Этот макрос нужно выполнять перед началом распределения блоков памяти соответствующего типа.
К операциям работы с памятью относятся следующие операции, выполняемые над блоками памяти: выделение/освобождение/повторное выделение (ailocation/free/reallocation), дамп (dump), проверка корректности содержимого (validation), получение и расширение размера блока (get/expand block size). — Пер
Для выполнения операций обработки блоков памяти в С нужно использовать полный набор макросов, которые передают значения блоков памяти соответствующим функциям обработки. Например, если в программе определена DVINFO-структура stdvBiockinfo, то распределения блоков памяти в С-программе следует выполнять с помощью следующего кода:
MEMDEBUG_MALLOC(&stdvBlockInfo, sizeof (х) ) ;
Все макросы для С-функций, работающих с памятью, можно найти в заключительной части листинга 15-1. Запоминать DVINFO-структуры для каждого типа распределения памяти хотя и возможно, но не очень практично, поэтому для обработки различных DVINFO-структур можно определять специальные макросы-оболочки; таким макросам нужно передавать параметры обычных функций работы с памятью.