После чего есть предупреждение:
Глобальная замена оператора new в коде программы обычно является безопасной операцией. Но если в области действия приведённого выше макроса окажется класс, реализующий собственную версию оператора new, Visual C++ откажется его компилировать и выдаст множество странных ошибок. Будьте внимательны, чтобы не допустить такой ситуации.
Вот собственно с этим у меня проблемы. У меня приложение, написанное на архитектуре документ/вид. В исходниках MFC переодически объявляются их собстенные варианты new, так что при добавлении моего дебажного new программа перестаёт компилиться. Что можно с этим сделать?
T>После чего есть предупреждение: T>Глобальная замена оператора new в коде программы обычно является безопасной операцией. Но если в области действия приведённого выше макроса окажется класс, реализующий собственную версию оператора new, Visual C++ откажется его компилировать и выдаст множество странных ошибок. Будьте внимательны, чтобы не допустить такой ситуации.
T>Вот собственно с этим у меня проблемы. У меня приложение, написанное на архитектуре документ/вид. В исходниках MFC переодически объявляются их собстенные варианты new, так что при добавлении моего дебажного new программа перестаёт компилиться. Что можно с этим сделать?
я так понимаю, что ты должен был тока определить макрос _CRTDBG_MAP_ALLOC
(проще всего это сделать в настройках проекта). и подключил файл <ctrdbg.h>?
ты все это сделал и посыпались ошибки?
IL>я так понимаю, что ты должен был тока определить макрос _CRTDBG_MAP_ALLOC IL>(проще всего это сделать в настройках проекта). и подключил файл <ctrdbg.h>? IL>ты все это сделал и посыпались ошибки?
Да, все необходимые действия я уже сделал. Более того, я выяснил, что не компилятся классы, которые объявлены с IMPLEMENT_DYNCREATE. Остальные (даже MFC — шные) компилятся без проблем, и что самое главное, правильно показывают, где происходят утечки памяти.
Здравствуйте, Trapper, Вы писали:
IL>>я так понимаю, что ты должен был тока определить макрос _CRTDBG_MAP_ALLOC IL>>(проще всего это сделать в настройках проекта). и подключил файл <ctrdbg.h>? IL>>ты все это сделал и посыпались ошибки?
T>Да, все необходимые действия я уже сделал. Более того, я выяснил, что не компилятся классы, которые объявлены с IMPLEMENT_DYNCREATE. Остальные (даже MFC — шные) компилятся без проблем, и что самое главное, правильно показывают, где происходят утечки памяти.
а какие ошибки получаешь? можешь прислать кусок кода, который не компилится?
Ошибка в строчке с IMPLEMENT_DYNCREATE
error C2661: 'CObject::operator new' : no overloaded function takes 4 parameters
По всей видимости, это из — за того, что в IMPLEMENT_DYNCREATE используется оператор new, который определён где — то раньше, и принимает другие параметры.
Вопрос в том, что с этим всем делать?
T>Ошибка в строчке с IMPLEMENT_DYNCREATE T>error C2661: 'CObject::operator new' : no overloaded function takes 4 parameters
T>По всей видимости, это из — за того, что в IMPLEMENT_DYNCREATE используется оператор new, который определён где — то раньше, и принимает другие параметры. T>Вопрос в том, что с этим всем делать?
из DllMain или (Win)Main или чего там вместо них в MFC?
по идее при завершении программы должена быть ввыведена инф-ция о мемори-ликах.
может не будет номеров строк и файлов -- можно изловчиться и без этого обойтись.
IL>из DllMain или (Win)Main или чего там вместо них в MFC? IL>по идее при завершении программы должена быть ввыведена инф-ция о мемори-ликах. IL>может не будет номеров строк и файлов -- можно изловчиться и без этого обойтись.
Ты будешь долго смеяться, но я вызываю эту функцию при старте приложения в CMyApp::CMyApp()
Определённый дамп я получаю в окно Output, но без информации о номере строки и имени файла. Проект большой, гадать не хочется
IL>>из DllMain или (Win)Main или чего там вместо них в MFC? IL>>по идее при завершении программы должена быть ввыведена инф-ция о мемори-ликах. IL>>может не будет номеров строк и файлов -- можно изловчиться и без этого обойтись.
T>Ты будешь долго смеяться, но я вызываю эту функцию при старте приложения в CMyApp::CMyApp() T>Определённый дамп я получаю в окно Output, но без информации о номере строки и имени файла. Проект большой, гадать не хочется
а чего гадать? номер неосвобожденного блока тебе в логе пишут.
поэтому можно поставить условный breakpoint в файле dbgheap.c в функции _heap_alloc_dbg:
условный breakpoint типа "lRequest = 777".
Поэтому после запуска программы останавливаешься в момент выделения этого блока -- а потом выясняешь, почему ты его не удалил.
PS. dbgheap.cpp лежит в каталоге Visual Studio Dir\Vc7\crt\src\dbgheap.c
IL>а чего гадать? номер неосвобожденного блока тебе в логе пишут. IL>поэтому можно поставить условный breakpoint в файле dbgheap.c в функции _heap_alloc_dbg:
IL>
IL>условный breakpoint типа "lRequest = 777". IL>Поэтому после запуска программы останавливаешься в момент выделения этого блока -- а потом выясняешь, почему ты его не удалил.
IL>PS. dbgheap.cpp лежит в каталоге Visual Studio Dir\Vc7\crt\src\dbgheap.c
Спасибо, не знал про такой способ!
Сижу в дебагере, вернусь не скоро
Здравствуйте, IamLexa, Вы писали:
IL>а чего гадать? номер неосвобожденного блока тебе в логе пишут. IL>поэтому можно поставить условный breakpoint в файле dbgheap.c в функции _heap_alloc_dbg:
IL>
IL>условный breakpoint типа "lRequest = 777". IL>Поэтому после запуска программы останавливаешься в момент выделения этого блока -- а потом выясняешь, почему ты его не удалил.
IL>PS. dbgheap.cpp лежит в каталоге Visual Studio Dir\Vc7\crt\src\dbgheap.c
А можно глупый вопрос, как туда бряк поставить, вроде в проект его не добавить. Разьясните поподробней или дайте плз ссылочку.
Здравствуйте, mentor, Вы писали:
IL>>PS. dbgheap.cpp лежит в каталоге Visual Studio Dir\Vc7\crt\src\dbgheap.c
M>А можно глупый вопрос, как туда бряк поставить, вроде в проект его не добавить. Разьясните поподробней или дайте плз ссылочку.
Если ты используешь debug-версию C runtime, то этот файл уже в твоем проекте (в libc.lib, libcmt.lib ...)
Так что открывай его, ставь бряк и пользуйся.
T>После чего есть предупреждение: T>Глобальная замена оператора new в коде программы обычно является безопасной операцией. Но если в области действия приведённого выше макроса окажется класс, реализующий собственную версию оператора new, Visual C++ откажется его компилировать и выдаст множество странных ошибок. Будьте внимательны, чтобы не допустить такой ситуации.
T>Вот собственно с этим у меня проблемы. У меня приложение, написанное на архитектуре документ/вид. В исходниках MFC переодически объявляются их собстенные варианты new, так что при добавлении моего дебажного new программа перестаёт компилиться. Что можно с этим сделать?
Уважаемый, та статья была написана для проектов, которые не используют MFC. У MFC уже все это есть. Когда вы генерируете любой default MFC project, в код каждого CPP file (исключая stdafx.cpp file) CPP вставляется такая конструкция:
Здравствуйте, IamLexa, Вы писали:
M>>А можно глупый вопрос, как туда бряк поставить, вроде в проект его не добавить. Разьясните поподробней или дайте плз ссылочку.
IL>Если ты используешь debug-версию C runtime, то этот файл уже в твоем проекте (в libc.lib, libcmt.lib ...) IL>Так что открывай его, ставь бряк и пользуйся.
А если я открываю его, ставлю бряк, а он мне говорит, что бряк будет disabled то это значит, что я не debug-версию использую или что не так файл открываю?
А>Уважаемый, та статья была написана для проектов, которые не используют MFC. У MFC уже все это есть. Когда вы генерируете любой default MFC project, в код каждого CPP file (исключая stdafx.cpp file) CPP вставляется такая конструкция: А>
Здравствуйте, mentor, Вы писали:
M>Здравствуйте, IamLexa, Вы писали:
M>>>А можно глупый вопрос, как туда бряк поставить, вроде в проект его не добавить. Разьясните поподробней или дайте плз ссылочку.
IL>>Если ты используешь debug-версию C runtime, то этот файл уже в твоем проекте (в libc.lib, libcmt.lib ...) IL>>Так что открывай его, ставь бряк и пользуйся.
M>А если я открываю его, ставлю бряк, а он мне говорит, что бряк будет disabled то это значит, что я не debug-версию использую или что не так файл открываю?
Хм.. странно. У меня вообще такого сообщения нет. Даже в релизной версии брекпоинт ставится нормально.