C ++: std: установить утечки памяти в main () - PullRequest
1 голос
/ 13 января 2012

В Microsoft Visual C ++ (VS 2008/2010) с использованием нескольких контейнеров стандартной библиотеки шаблонов, таких как std :: set или std: vector, вы столкнетесь с утечками памяти с помощью этого:

#include <set>
#include <stdlib.h>
#include <crtdbg.h>
#define _CRTDBG_MAP_ALLOC

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    printf("I'm leaking\n");

    std::set<int> s;

    _CrtDumpMemoryLeaks();
    return 0;
}

После того, как вы запустите программу, вы получите такой вывод:

Detected memory leaks!
Dumping objects ->
{209} normal block at 0x005E9C68, 20 bytes long.
 Data: <h ^ h ^ h ^     > 68 9C 5E 00 68 9C 5E 00 68 9C 5E 00 CD CD CD CD 
{208} normal block at 0x005E9C20, 8 bytes long.
 Data: <  ;     > F8 FE 3B 00 00 00 00 00 
Object dump complete.

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

int _tmain(int argc, _TCHAR* argv[])
{
    printf("I'm not leaking any more\n");

    {
        std::set<int> s;
    }
    _CrtDumpMemoryLeaks();
    return 0;
}

Это странное поведение, и мне интересно, это ошибка в компиляторах Microsoft или какая-то проблема STL? Я думаю, что это первое. Если, возможно, кто-нибудь попробовал это на Linux-системе, было бы интересно узнать ...

1 Ответ

5 голосов
/ 13 января 2012

Как в первом примере течь? s все еще находится в области видимости, поэтому, конечно, с ним все еще связана память. Вам нужно будет сделать вызов обнаружения утечки памяти после возврата _tmain, чтобы получить правильный ответ.

Во втором примере s находится вне области видимости и уничтожен, поэтому неудивительно, что с ним больше не связано памяти.

Вам просто нужно вызвать средство проверки утечки в тех местах кода, которые имеют смысл.

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