使用CRT内存泄漏检测时编译错误

时间:2010-11-29 06:55:09

标签: c++ new-operator

要检测内存泄漏,请重新定义新关键字。 如果我使用[Type 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 个答案:

答案 0 :(得分:2)

因为您的宏导致您的展示位置新扩展为:

Foo* pFoo2 = new(_CLIENT_BLOCK, __FILE__, __LINE__) (pFoo) Foo();

这显然是无效的语法。

MSFT工程师confirms

  新版

#define与展示位置

不兼容

因此您无法将其与crtdbg.h一起使用。