我的目标是编写独立于平台的空闲内存检查器。就像是:
std::size_t before = MemoryAllocated();
do_stuff(); //some algorithm that uses malloc, free, new, delete, etc
std::size_t after = MemoryAllocated();
if( after != before )
printf( "ALARM! MEMORY LEAKS!\n" );
在 POSIX 上有 mallinfo(),它提供了非常全面的空闲内存统计信息,其中一个字段是 uordblks,它似乎准确地显示了我想要的内容。它包括开销——例如,它显示我机器上的 new int 分配了 32 个字节。但归根结底,如果你释放了所有东西 - 它显示 0,如果你忘记了一些东西 - 它是非零的。
在 Windows 上有 _heapwalk()。它比 mallinfo() 稍微复杂一点——您需要遍历堆块并自己计算大小。即使你这样做了,结果也不是我所期望的:
int main()
{
std::cout << "start " << MemoryAllocated() << std::endl;
char *charr = new char[100];
std::cout << "after new char[100] " << MemoryAllocated() << std::endl;
int *pint = new int;
std::cout << "after new int " << MemoryAllocated() << std::endl;
delete[] charr;
std::cout << "after delete[] chars " << MemoryAllocated() << std::endl;
delete pint;
std::cout << "after delete int " << MemoryAllocated() << std::endl;
return 0;
}
结果是:
start 26980
after new char[100] 31176
after new int 31180
after delete[] chars 31080
after delete int 31076
看起来它在我第一次请求分配的内存时为他的内部需求分配了一些初始的 4 KB 内存,但随后它准确地显示了当前状态。
我试图在开始实际计数之前预先分配一些东西 - 它没有帮助。
任何人都可以提示我,如何在 Windows 上正确地做到这一点?