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函数…