Ошибки компиляции при использовании CRT Memory Leak Detection
Чтобы обнаружить утечку памяти, новое ключевое слово переопределяется. Это нормально, если я использую [Тип 1]. Но ошибка компиляции происходит, если я раскомментирую [Тип 2]. Есть ли способ использовать оба типа нового?
#include <crtdbg.h>
#define new new(_CLIENT_BLOCK, __FILE__, __LINE__)
struct Foo
{
int m_N;
Foo() : m_N( 0 ) {}
};
int main( int argc, char* argv[] )
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_CrtSetReportMode(_CRT_WARN , _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
int* pI = new int( 1 );
delete pI;
Foo* pFoo = new Foo; // [Type 1]
//Foo* pFoo2 = new (pFoo) Foo(); // [Type 2]
return 0;
}
1 ответ
Решение
Поскольку ваш макрос приводит к расширению вашего места размещения до:
Foo* pFoo2 = new(_CLIENT_BLOCK, __FILE__, __LINE__) (pFoo) Foo();
что явно неверный синтаксис.
Инженер MSFT подтверждает:
#define
нового не совместимо с размещением нового
так что вы не можете использовать его с crtdbg.h
,