перестало работать окно вывода visual studio 2008 - PullRequest
1 голос
/ 20 сентября 2011

Я уже некоторое время работаю над проектом C ++ в VS 2008. До недавнего времени, после завершения моего приложения, окно вывода показывало, если у меня были утечки памяти.однако, несколько дней назад я заметил, что это перестало показывать эту ценную информацию.Я также попытался использовать printf (), но в окне вывода это тоже не отображается.

Я предполагаю, что где-то изменил предпочтение, но, похоже, не могу его найти.все выходные данные теперь показывают, какие библиотеки были загружены / выгружены.есть идеи?

спасибо, майк

1 Ответ

0 голосов
/ 20 сентября 2011

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

  1. Изменения в исходном коде, которые:

    • отключение отчетов об утечке памяти (т. Е. Использование _CrtSetDbgFlag )
    • установка пользовательских хуков отчетов (см. _CrtSetReportHook, _CrtSetReportHook2 )
    • перенаправить вывод в файл (см. CrtSetReportMode
    • изменения в исходном коде, которые приводят к тихим «сбоям» при завершении работы приложения - приложение молча завершает работу без какого-либо указания на проблему, прежде чем достигнет точки, когда сообщается об утечке памяти (как бы невероятно это ни казалось, у меня это было когда-то) .
  2. Настройки в среде разработки приводят к перенаправлению вывода в другое окно. Один из возможных вариантов: Инструменты \ Параметры \ Отладка \ Общие \ Перенаправить весь текст окна вывода в окно немедленного действия (пятое снизу). Возможно, здесь есть и другие возможности.

Полагаю, одной из возможностей исключить пункт 2 было бы создание простого консольного приложения в строках (main.cpp):

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

#ifndef DEBUG_NEW
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif

int _tmain(int argc, _TCHAR* argv[])
{
    int nOldState = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
    _CrtSetDbgFlag(nOldState | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

    int *pInt = new int[100];
    return 0;
}

Если запуск этого приложения правильно выдает утечки памяти, то, к сожалению, вы, вероятно, в случае 1

Конечно, я исключил очевидные вещи, по которым вывод можно было пропустить (некоторые из них уже упоминались в комментариях).

...