我使用宏代替new
在调试模式下获取一些额外信息:
#if defined(_DEBUG)
#define SAGE_NEW new(__FUNCTION__, __FILE__, __LINE__)
#else
#define SAGE_NEW new
#endif
我发现这在自定义内存分析和内存泄漏检测中非常有用。我刚开始使用共享指针,所以现在我正在制作堆对象,例如:
auto myThingy = std::shared_ptr<Thingy>(SAGE_NEW Thingy(Args) );
我刚刚了解到这std::make_shared
是首选,因为它使用更少的内存分配。有什么办法可以包括我SAGE_NEW
的make_shared
吗?我意识到泄漏检测并不重要,但我仍然希望它用于内存使用统计。似乎allocate_shared
以某种方式掌握了答案,但我还没有弄清楚。谢谢!:)
编辑:对于那些询问new
-我用自定义重载它new
。编译器选项 SAGE_MEM_INFO 打开泄漏检测和内存使用统计信息,否则它会跳过日志记录并直接进入我的内存池分配。我有 new[] 和 delete[] 变体,但为简洁起见,我省略了这些变体:
#ifdef SAGE_MEM_INFO
void* operator new (size_t size){ ++appAllocs; return myAlloc(size); }
void* operator new (size_t size, char const *function, char const *filename, int lineNum)
{
... Log memory usage
void* ptr = ::operator new(size);
return ptr;
}
void operator delete (void* ptr)
{
... Log freeing of this pointer
--appAllocs;
myFree(ptr);
}
void operator delete (void* ptr, char const *function, char const *filename, int lineNum)
{
... Log freeing of this pointer
--appAllocs;
myFree(ptr);
}
#else
void* operator new (size_t size){ return myAlloc(size); }
void* operator new (size_t size, char const *function, char const *filename, int lineNum)
{
void* ptr = ::operator new(size);
return ptr;
}
void operator delete (void* ptr) { myFree(ptr); }
void operator delete (void* ptr, char const *function, char const *filename, int lineNum) { myFree(ptr); }
#endif