Отладка Visual C ++ CRT

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

Мне удалось сузить его до конструкции new ( _NORMAL_BLOCK , __FILE__ , __LINE__ ). Как только эта перегрузка нового оператора была использована, я получаю error LNK2005: "void __cdecl operator delete(void *,int,char const *,int)" (??3@YAXPEAXHPEBDH@Z) already defined in ...

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

Это привело меня в безумную погоню за гусями, потому что, если вы погуглите эту ошибку, все доказательства скажут вам, что вы смешиваете CRT и MFC в неправильном порядке, и, конечно же, это то, что я делал.

Я просмотрел все свои объектные файлы и библиотеки с помощью dumpbin /directives и убедился, что порядок связывания правильный, несмотря на все это, я так и не смог преодолеть эту ошибку.

Метод отладки CRT несовместим с MFC или есть объяснение этому?

Я не очень хорошо разбираюсь в MFC и пытаюсь полностью отказаться от MFC, но я бы хотел, чтобы это работало, пока это не произойдет.


person John Leidegren    schedule 02.09.2012    source источник
comment
Я дважды пытался использовать CRT-материалы для обнаружения утечек памяти, но безуспешно. Я бы порекомендовал вам собственную упаковку или обходные пути. Или воспользуйтесь одним из инструментов управления памятью.   -  person Kirill Kobelev    schedule 02.09.2012
comment
Не могли бы вы опубликовать все сообщение об ошибке компоновщика?   -  person john    schedule 02.09.2012
comment
@john Конечно ... если это поможет. Я обновил вопрос, чтобы включить полную ошибку, я удалил только объект и имя файла.   -  person John Leidegren    schedule 02.09.2012
comment
@john, Вы пробовали тот же набор функций CRT на небольшой выборке?   -  person Kirill Kobelev    schedule 02.09.2012
comment
@KirillKobelev Нет, я потратил на это целый день, после чего перенес весь проект с VC2008 на VC2010, но безуспешно. Атм, я не могу тратить больше времени на отладку этого, я действительно надеюсь, что кто-то более знающий и опытный скажет мне, что случилось с процессом компоновщика ...   -  person John Leidegren    schedule 02.09.2012
comment
@KirillKobelev, как сейчас обстоят дела, я использую идентификаторы блоков из отладочной кучи, чтобы сломаться с помощью функции _CrtSetBreakAlloc, и это требует больше времени, но дело сделано.   -  person John Leidegren    schedule 02.09.2012
comment
Вы пробовали это - support.microsoft.com/kb/148652? И проверьте этот поток stackoverflow.com/questions/1146338/.   -  person SChepurin    schedule 02.09.2012
comment
@SChepurin Да, как я сказал в своем вопросе, вы могли бы подумать, что это проблема, но это не так.   -  person John Leidegren    schedule 04.09.2012


Ответы (1)


Приложения MFC обнаружат утечки памяти за вас в режиме отладки. Чтобы получить дополнительную информацию об утечке, вы можете определить new для DEBUG_NEW в верхней части каждого файла следующим образом:

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

Для получения дополнительной информации см. Статью MSDN Memory Leak Обнаружение в MFC

person TheSteve    schedule 04.09.2012