【问题标题】:Compile errors when I using CRT Memory Leak Detection使用 CRT 内存泄漏检测时的编译错误
【发布时间】:2010-11-29 06:55:08
【问题描述】:

为了检测内存泄漏,重新定义了 new 关键字。 如果我使用 [Type 1] 就可以了。但是如果我取消注释 [Type 2],就会发生编译错误。 有什么方法可以同时使用这两种类型的 new 吗?

#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;
}

【问题讨论】:

标签: c++ new-operator


【解决方案1】:

因为您的宏会使您的展示位置 new 扩展到:

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

这显然是无效的语法。

一位微软工程师confirms:

#define of new 与放置 new 不兼容

所以你不能将它与crtdbg.h 一起使用。

【讨论】:

  • 然而,pragma 指令解决了这个问题,只关注编译。
  • #pragma push_macro("new") ... #pragma pop_macro("new")
猜你喜欢
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2021-09-01
  • 2010-12-01
  • 2021-11-29
相关资源
最近更新 更多