私の目標は、プラットフォームに依存しないフリー メモリ チェッカーを作成することです。何かのようなもの:
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() があります。フィールドの 1 つは uordblks で、私が望むものを正確に示しているようです。これにはオーバーヘッドが含まれます。たとえば、マシンの新しい 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 キロバイトのメモリが割り当てられているように見えますが、現在のステータスが正確に表示されます。
実際のカウントを開始する前に、何かを事前に割り当てようとしましたが、役に立ちません。
Windowsで適切に行う方法を教えてもらえますか?