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

lin*_*per 5 c++ memory memory-leaks new-operator operator-keyword

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

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

我想编写一个简单的接口来覆盖newdelete

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

有没有人尝试过?我不确定我是否可以从班级特定的新运算符中调用标准新。

Ser*_* K. 0

在这个问题中,我针对您的问题提出了一个临时解决方案:立即检测 Windows 上的堆损坏错误。如何?

一般来说,您可以用以下代码替换您的newand :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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

return ::new(nSize);
Run Code Online (Sandbox Code Playgroud)