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)
与其将 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 ,你可以,但你必须重新定义类中的重载以匹配你的新重载。