我正在尝试编写一个小型内存泄漏检测工具。
我的想法是在我的应用程序中跟踪动态内存分配生命 确定任何无效的内存访问或未删除的内存,这可能会导致我的应用程序在使用时内核。
我想编写一个简单的界面来覆盖new
和delete
。
在我被覆盖的new
中,我想打印功能行地址等。然后调用标准new
。
有没有人试过这个?我不确定我是否可以从我的班级特定新操作员那里调用标准新版本。
答案 0 :(得分:0)
从特定于班级的::operator new
调用operator new
很好,很常见。您无法从::operator new
的替换版本调用全局运算符new,因为如果替换全局运算符new,则旧运算符不存在。
答案 1 :(得分:0)
在这个问题中,我提出了一个针对您的问题的临时解决方案:Immediate detection of heap corruption errors on Windows. How?
通常,您可以使用以下代码替换new
和delete
:
DWORD PageSize = 0;
inline void SetPageSize()
{
if ( !PageSize )
{
SYSTEM_INFO sysInfo;
GetSystemInfo(&sysInfo);
PageSize = sysInfo.dwPageSize;
}
}
void* operator new (size_t nSize)
{
SetPageSize();
size_t Extra = nSize % PageSize;
nSize = nSize + ( PageSize - Extra );
return Ptr = VirtualAlloc( 0, nSize, MEM_COMMIT, PAGE_READWRITE);
}
void operator delete (void* pPtr)
{
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(pPtr, &mbi, sizeof(mbi));
// leave pages in reserved state, but free the physical memory
VirtualFree(pPtr, 0, MEM_DECOMMIT);
DWORD OldProtect;
// protect the address space, so noone can access those pages
VirtualProtect(pPtr, mbi.RegionSize, PAGE_NOACCESS, &OldProtect);
}
确定无效的内存访问。在进一步的讨论中,您将找到泄漏检测和检测其他内存错误的想法。
如果要调用全局new
和delete
,可以使用::
全局命名空间前缀:
return ::new(nSize);
答案 2 :(得分:0)
这里有几篇文章:
http://www.codeproject.com/Articles/8448/Memory-Leak-Detection
http://www.codeproject.com/Articles/19361/Memory-Leak-Detection-in-C
http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio
http://www.codeproject.com/Articles/393957/Cplusplus-Memory-Leak-Finder
答案 3 :(得分:0)
所描述的方法听起来很合理。您可以增强它并将每个分配的一些识别数据存储到某些数据结构中。这样,您可以在程序终止时跟踪所有未释放的内存,而无需检查所有分配/释放日志。
为了检测损坏,您可以在开始之前和结束之后用填充包装每个分配,并用一些预定义的模式填充它。在释放内存后,您可以验证模式是否仍然存在。这将为您提供检测腐败的良好机会。
您可以使用范围前缀new
调用全局::new
。