内存泄漏检测并覆盖新的?

Kyl*_*yle 5 c++ memory-leaks unmanaged

我试图在这两篇文章的帮助下进行内存泄漏检测:http : //msdn.microsoft.com/en-us/library/e5ewb1h3%28VS.80%29.aspx http://support.microsoft. COM/KB/q140858 /

所以在我的stdafx.h中我现在有:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,我有一个覆盖新函数的类:

class Dummy
{    
  //overloaded new operator
  void FAR* operator new(size_t cb);
}
Run Code Online (Sandbox Code Playgroud)

现在当我编译这段代码时,我得到:错误C2059:语法错误:'常量'错误C2091:函数返回函数

知道如何解决这个问题吗?

Log*_*ldo 10

您可以使用pragma指令在取消过载时保存和恢复新宏.有关确切的语法,请参阅[MSDN](http://msdn.microsoft.com/en-us/library/hsttss76 ( VS.71).aspx).

例如

#pragma push_macro("new")
#undef new
void FAR* operator new(size_t cb);
#pragma pop_macro("new") 
Run Code Online (Sandbox Code Playgroud)

您可以将这些放在标题中,例如

begin_new_override.h:

#ifdef new
#define NEW_WAS_DEFINED
#pragma push_macro("new")
#undef new
#endif
Run Code Online (Sandbox Code Playgroud)

end_new_override.h:

#ifdef NEW_WAS_DEFINED
#undef NEW_WAS_DEFINED
#pragma pop_macro("new")
#endif
Run Code Online (Sandbox Code Playgroud)

然后

#include "begin_new_override.h"
void FAR* operator new(size_t cb);
#include "end_new_override.h"
Run Code Online (Sandbox Code Playgroud)


dma*_*dma 5

与其将 new 定义为不同的东西,为什么不重载operator new呢?

在全局命名空间中的某个位置添加这些函数定义:

// operator new overloads
void* operator new( const size_t size, const char* file, int line) throw();
void* operator new( const size_t size, const size_t align, const char* file, int line) throw();
void* operator new[]( const size_t size, const char* file, int line) throw();
void* operator new[]( const size_t size, const size_t align, const char* file, int line) throw();

// can't easily overload operator delete
void operator delete( void* ptr ) throw();
void operator delete[]( void* ptr ) throw();

// matched to the operator new overload above in case of exceptions thrown during allocation
void operator delete( void* ptr, const char* file, int line) throw();
void operator delete[]( void* ptr, const char* file, int line) throw();
void operator delete( void* ptr, const size_t align, const char* file, int line) throw();
void operator delete[]( void* ptr, const size_t align, const char* file, int line) throw();

// global new/delete
void* operator new( size_t size ) throw();
void* operator new( size_t size, const std::nothrow_t& ) throw();
void* operator new( size_t size, size_t align ) throw();
void* operator new( size_t size, size_t align, const std::nothrow_t& ) throw();

void* operator new[]( size_t size ) throw();
void* operator new[]( size_t size, const std::nothrow_t& ) throw();

void operator delete( void* ptr, const std::nothrow_t&) throw();
void operator delete[]( void* ptr, const std::nothrow_t&) throw();
Run Code Online (Sandbox Code Playgroud)

然后,您可以定义自己的新宏,该宏调用非全局版本并实现全局版本以断言或警告它们是否被调用(以捕获任何漏掉的内容)。

#define MY_NEW(s)    new(s, __FILE__, __LINE__)
Run Code Online (Sandbox Code Playgroud)

如果您直接在类上调用“new”,您的类级重载将按预期工作。如果你想在类上调用 MY_NEW ,你可以,但你必须重新定义类中的重载以匹配你的新重载。