Я использую стандартные программы обнаружения утечки памяти Визуального CRT от
; когда я звоню _CrtDumpMemoryLeaks
об одном выделении последовательно сообщают на каждом вызове программы:
{133} normal block at 0x04F85628, 56 bytes long.
Data: < > B0 81 F8 04 B0 81 F8 04 B0 81 F8 04 CD CD CD CD
Адрес варьируется, но {133}
всегда то же.
Согласно инструкциям MSDN относительно того, Как установить точки останова на числе выделения памяти, я должен быть в состоянии установить точку останова на 133-м выделении с этим вызовом:
_CrtSetBreakAlloc(133);
и я могу также проверить в окне часов это {,,msvcr90d.dll}_crtBreakAlloc
действительно установлен на 133. После выходов программы отчет об утечке все еще перечисляет № 133 (наряду с некоторыми более высокими числами), но никакая точка останова не происходит. Почему это могло бы быть и как я заставляю точку останова происходить?
Потенциально соответствующая информация:
__asm int 3
хорошо работает также._crtBreakAlloc
вызывает точку останова любой (не те, я попробовал так или иначе), Без использования наследования (как упомянуто автором ), кажется, вы ищете решение, которое может преобразовать
один класс в другой с предварительным утверждением разработчика знает и понимает сходство 2 классов .
Нет существующего решения для преобразования между объектами. Можно попробовать:
Можно сделать что-то подобное.
let inline sum<'a when 'a : (static member (+) : 'a -> 'a -> 'a)> a b =
a + b
let result = sum<int> 3 4
Однако если я попытаюсь let result = sum 3 4
я получаю ошибку «неоднозначность типа, присущую использованию оператора '(+)'»
Большая пощечина лба... Одна из «очевидных» причин заключается в том, что распределение # 133 произошло до установки точки останова...
Просто первая утечка произойдет до того, как будет вызвана моя DLL. На самом деле это не обязательно утечка, потому что я вызываю _ CrtDumpMemureLeaks
, когда DLL выгружается, а не когда родительское приложение выполняется деинициализация.
Что касается «Потенциально релевантной информации № 4» в моем первоначальном вопросе - ну я попробовал несколько значений, но каким-то образом ни одна не была выше 133...
Похоже, что вы компилируете свое приложение с помощью не отладочной lib, например, если вы используете релизную версию lib, которая должна сломать ваше приложение, она этого не сделает. Возможно, это происходит потому, что вы используете приложение сторонних разработчиков. Также возможно, что не отладочная dll загружается вместо отладочной во время выполнения.
Попробуйте посмотреть, загружаются ли нужные DLLs для вашего приложения во время отладки, а также, что приложение или DLL на самом деле отлажено. (Иногда вам явно приходится загружать dll или exe в отладчик.)
Это все, о чем я могу думать, не видя более подробной информации об этом....