Обнаружение утечки памяти в программах, разрабатываемых на Windows - PullRequest
2 голосов
/ 01 февраля 2011

Я работаю в Visual Studio над разработкой программы на C. Есть ли способ, которым я могу обнаружить утечки памяти моей программы в Visual Studio?Или вообще любая библиотека обнаружения утечек памяти для Windows-разработчика (похожая на valgrind для Linux) .... Пожалуйста, дайте мне знать.Спасибо.

Ответы [ 5 ]

2 голосов
/ 01 февраля 2011

Вы можете #include <crtdbg.h>

В начале вашей программы введите следующий код:

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEMDF | _CRT_LEAK_CHECK_DF);

или в конце вашей программы перед возвратом кода выхода:

_CrtDumpMemoryLeaks();

Первый способ лучше imo, потому что он будет автоматически отображать утечки памяти при каждом выходе из программы, и это только одна строка кода.Если вы используете _CrtDumpMemoryLeaks(), вы будете вынуждены размещать его везде, где ваша программа потенциально может выйти.

Любые утечки памяти будут отображаться в вашем окне вывода при выходе из программы.Это работает только в Visual Studio.

Я не думаю, что это покажет файл и номер строки, где произошло распределение.В C ++ вы можете, если переопределите ключевое слово new, чтобы отобразить, где произошло распределение:

#ifdef _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
1 голос
/ 21 ноября 2011

Я использую Визуальный детектор утечек . Это бесплатно и очень эффективно, и вам нужно только включить заголовочный файл <vld.h> в вашу программу.
Дает полную трассировку стека памяти, которая была выделена и не освобождена.

0 голосов
/ 03 сентября 2018

Хорошо, я знаю, что эта тема старая, но мне удалось обнаружить утечки памяти, улучшив фактические функции malloc и free с помощью моих собственных функций. К сожалению, вам нужно распределять и освобождать память с помощью этих функций, и это решение работает только для Windows.

Если вы заинтересованы в этом, просто включите это в свой код или создайте заголовок для этого.

#include <malloc.h>

typedef struct{
    BOOL detection;
    LONG allocs;
    LONG frees;
    LONG memoryUsed;
    LONG memoryReleased;
    LONG memoryActual;
} MEMORY_WATCH;
MEMORY_WATCH MEMORY = {FALSE, 0, 0, 0, 0, 0};
/**
 * Controlled Memory Allocations.
 * 
 * @param size Size of the requested memory.
 * @return A pointer to requested memory.
 */
void *CMalloc(size_t size){
    void *memblock = malloc(size);
    if(MEMORY.detection && memblock != NULL){
        MEMORY.allocs++;
        MEMORY.memoryUsed += size;
        MEMORY.memoryActual += size;
    }
    return memblock;
}
/**
 * Controlled Memory Release.
 * 
 * @param memblock A pointer to memory that is going to be released.
 */
void CFree(void *memblock){
    if(MEMORY.detection && memblock != NULL){
        MEMORY.frees++;
        MEMORY.memoryReleased += _msize(memblock);
        MEMORY.memoryActual -= _msize(memblock);
    }
    free(memblock);
}

В начале основной программы типа MEMORY.detection = TRUE и в конце основной вы можете вывести ее так:

printf("\n\nMemory result:\n");
printf("\t%ld calls\tAllocated\n\t%ld calls\tFreed\n\n", MEMORY.allocs, MEMORY.frees);
printf("\t%ld bytes\tUsed\n\t%ld bytes\tReleased\n\n", MEMORY.memoryUsed, MEMORY.memoryReleased);
printf("\t%ld bytes\tMissing\n", MEMORY.memoryActual);

Я применил это решение в своей программе и обнаружил утечку, которая заняла у меня 7 байт. Просто забыл освободить один блок памяти.

Number of Values: 7
        Value(4): Path
                (132):  REG_EXPAND_SZ
                "C:\ProgramFiles\Windows\System Overflow.exe" "-i -x -v file.txt"
        Value(9): Languages
                (6):    REG_MULTI_SZ
                (6): EN
                (6): SK
                (6): CZ
                (8): GER
                (6): JP
                (6): RU
        Value(16): SelectedLanguage
                (6):    REG_SZ
                EN
        Value(11): KeyModifier
                (6):    REG_BINARY
                0 16 17 33 99 113
        Value(9): SpecialID
                (4):    REG_DWORD
                22689
        Value(8): UniqueID
                (8):    REG_QWORD
                110022689
        Value(9): Standards
                (5):    REG_MULTI_SZ
                (14): ISO600
                (16): ISO9236
                (18): ISO9236a
                (18): ISO9236b
                (14): ISO512


Memory result:
        34 calls        Allocated
        33 calls        Freed

        374 bytes       Used
        367 bytes       Released

        7 bytes Missing

RUN SUCCESSFUL (total time: 22ms)
0 голосов
/ 21 ноября 2011

Для работы в Visual Studio уже разработаны и надежные плагины.Что касается меня, мне нравится deleteaker, он прост в использовании.

0 голосов
/ 01 февраля 2011

Я не опытный программист, но я использовал параллельную студию Intel для проверки утечек памяти. Это довольно невероятно, легко интегрируется в Visual Studio и предоставляет чрезвычайно простые элементы управления для обнаружения всех видов ошибок в вашей программе. Практически просто установите и запустите его, чтобы начать обнаруживать ошибки памяти.

Единственной проблемой был ценник, хотя есть 30-дневная пробная версия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...