如何在C ++中编写小内存泄漏检测?

时间:2012-11-15 16:41:15

标签: c++ memory memory-leaks new-operator operator-keyword

我正在尝试编写一个小型内存泄漏检测工具。

我的想法是在我的应用程序中跟踪动态内存分配生命 确定任何无效的内存访问或未删除的内存,这可能会导致我的应用程序在使用时内核。

我想编写一个简单的界面来覆盖newdelete

在我被覆盖的new中,我想打印功能行地址等。然后调用标准new

有没有人试过这个?我不确定我是否可以从我的班级特定新操作员那里调用标准新版本。

4 个答案:

答案 0 :(得分:0)

从特定于班级的::operator new调用operator new很好,很常见。您无法从::operator new的替换版本调用全局运算符new,因为如果替换全局运算符new,则旧运算符不存在。

答案 1 :(得分:0)

在这个问题中,我提出了一个针对您的问题的临时解决方案:Immediate detection of heap corruption errors on Windows. How?

通常,您可以使用以下代码替换newdelete

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

确定无效的内存访问。在进一步的讨论中,您将找到泄漏检测和检测其他内存错误的想法。

如果要调用全局newdelete,可以使用::全局命名空间前缀:

return ::new(nSize);

答案 2 :(得分:0)

答案 3 :(得分:0)

所描述的方法听起来很合理。您可以增强它并将每个分配的一些识别数据存储到某些数据结构中。这样,您可以在程序终止时跟踪所有未释放的内存,而无需检查所有分配/释放日志。

为了检测损坏,您可以在开始之前和结束之后用填充包装每个分配,并用一些预定义的模式填充它。在释放内存后,您可以验证模式是否仍然存在。这将为您提供检测腐败的良好机会。

您可以使用范围前缀new调用全局::new