Ошибки компиляции при использовании 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,

Другие вопросы по тегам