Если вы звоните _CrtDumpMemoryLeaks()
в начало основной функции, то поведение ожидается, так как mp_data
будет удалён после того, как был вызван _CrtDumpMemoryLeaks()
.
Вам нужно будет позвонить _CrtDumpMemoryLeaks()
после того, как последний деструктор ваших статических объектов был вызван (или, вернее, в последнем деструкторе после освобождения памяти), если вы не хотите видеть эти утечки (довольно сложная задача, попробуй).
уборщика подход выделить все статические объекты в куче вместо этого (в начале main
), и освободить их в конце main
, а затем вы можете вызвать _CrtDumpMemoryLeaks()
и не увидит какие-либо утечки памяти.
Статические объекты FYI с конструкторами и деструкторами считаются плохими в любом случае, потому что порядок, в котором они сконструированы/desctructed, не является детерминированным, и из-за этого статические объекты часто вводят ошибки, которые легко отлаживаются.
Редактировать комментарий по поводу Андрея: Вы могли бы попытаться отключить автоматический вызов _CrtDumpMemoryLeaks
по телефону _CrtSetDbgFlag, чтобы сбросить флаг _CRTDBG_LEAK_CHECK_DF
. Если это работает, вы можете добавить статический объект, который вызывает _CrtDumpMemoryLeaks()
в своем деструкторе. Чтобы убедиться, что этот объект был разрушен последним, вы можете использовать #pragma init_seg(compiler) directive.
Нет подсказки, если это будет работать ... кроме этого, все остальные решения, скорее всего, потребуют изменения библиотеки ITK (что должно быть возможно, это библиотека с открытым исходным кодом в конце концов ?!).
Это может быть ошибка Visual Studio. См. Комментарии в соответствии с принятым ответом [здесь] (http://stackoverflow.com/questions/2204608/does-c-call-destructors-for-global-and-class-static-variables). –
Нет, это не причина. Я проверил в отладчике, что '~ A()' действительно вызван. – Andrey