обнаружение утечек памяти: mallinfo, _heapwalk - PullRequest
0 голосов
/ 29 мая 2018

Моя цель - написать независимую от платформы бесплатную проверку памяти.Что-то вроде:

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, которое, кажется, показывает именно то, что я хочу.Он включает служебные данные - например, он показывает, что новый 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?

...