Утечки памяти обнаруживаются с помощью указателей типа char в std :: list - PullRequest
1 голос
/ 16 апреля 2010

почему я получаю ошибки утечки памяти без выделения или добавления каких-либо элементов в список ниже. Должен ли я просто игнорировать это?

#define CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <list>
using std::list;

int main()
{
    list <char*> roots;

    _CrtDumpMemoryLeaks();
}

Ответы [ 4 ]

11 голосов
/ 16 апреля 2010

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

#define CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <list>
using std::list;

int main()
{
    {
        list <char*> roots;
    }

    _CrtDumpMemoryLeaks();
}
3 голосов
/ 16 апреля 2010

Когда вы вызываете _CrtDumpMemoryLeaks, list еще не уничтожено, поэтому любое выделение памяти обрабатывается как утечка памяти. Это не имеет ничего общего с char*: то же самое произошло бы с list<int>.

_CrtDumpMemoryLeaks просто сообщает о любых выделениях, которые еще не были освобождены. Он не может знать, что деструктор list еще не запущен и не выполняет освобождения.

1 голос
/ 16 апреля 2010

В общем лучше сделать

_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF); (Вам могут понадобиться и другие флаги ...)

, что заставляет среду выполнения сбрасывать утечки памяти до ее выхода, чем явно вызывать _CrtDumpMemoryLeaks. Если вы сделаете это, вы можете быть уверены, что любые локальные переменные, которые все еще находятся в области видимости, а также любые глобальные переменные будут освобождены, поэтому все обнаруженные утечки памяти являются «реальными».

1 голос
/ 16 апреля 2010

Если вы используете C ++, то лучше использовать std :: string вместо char *.

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

В короткие сроки, вы должны освободить каждый символ * перед уничтожением / очисткой списка.

...