C++ 如何在C+中编写一个小型内存泄漏检测程序+;?

C++ 如何在C+中编写一个小型内存泄漏检测程序+;?,c++,memory,memory-leaks,new-operator,operator-keyword,C++,Memory,Memory Leaks,New Operator,Operator Keyword,我正在尝试编写一个小型内存泄漏检测工具 我的想法是跟踪应用程序中的动态内存分配生命周期 确定任何无效的内存访问或未删除的内存,这可能会导致我的应用程序在一段时间内核心化 我想编写一个简单的界面来覆盖新建和删除 在我覆盖的new中,我想打印函数行地址等,然后调用标准new 有人试过这个吗?我不确定是否可以从特定于类的新操作符调用standard new。调用::从特定于类的操作符new调用操作符new很好,而且非常常见。您不能从替换版本的::operator new调用全局运算符new,因为如果您

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

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

我想编写一个简单的界面来覆盖
新建
删除

在我覆盖的
new
中,我想打印函数行地址等,然后调用标准
new


有人试过这个吗?我不确定是否可以从特定于类的新操作符调用standard new。

调用
::从特定于类的
操作符new
调用操作符new
很好,而且非常常见。您不能从替换版本的
::operator new
调用全局运算符new,因为如果您替换全局运算符new,则旧运算符不存在。

在这个问题中,我为您的问题提出了一个特别的解决方案:

通常,您可以用以下代码替换
新建
删除

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

这里有几篇文章:


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

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


您可以使用作用域前缀调用global
new
::new

最简单的解决方案:
cd/project/src;fgrep--silent-r-e“new”和“Write better code”
关系模糊,主要是针对Windows的,但奇怪的是,在我读了Raymond Chen关于编写自己的分配器的博文之后,你的问题出现了:可能重复@SergeyK,这肯定不是重复你的问题。可能是重复@PiotrNycz-
mallow
<代码>确定,malloc`存在。这并没有改变这样一个事实,即如果你更换了新的全球运营商,你就不能打旧的。我是在电话里输入的,当然是
malloc
。您可以从new operator new调用
malloc
。。。对于旧操作员new-我不确定,从未尝试过此操作,但可能
dlsym(RTLD_NEXT,“name”)
可用于检索旧操作员new-需要检查
nm
新操作员的真实(损坏的名称)。。。但是正如我所说的,对于C++函数,从来没有使用dLScript(),只对C函数…