Странная утечка памяти - PullRequest
2 голосов
/ 10 ноября 2009

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

TagStruct TagData [] =
{

    { Tag_SecurityToken, string("x-abc-security-token"), string("ab-security-token") } ,
    { Tag_XYZ, string("x-abc-xyz"), string("ab-xyz") },
    { Tag_ChunkCount, string("x-abc-meta-chunk"), string("ab-meta-chunk") },
    { Tag_OriginalFileSize, string("x-abc-meta-totalsize"), string("ab-meta-totalsize")}

};

странная вещь, конечно, проблема утечки памяти, а самая странная проблема заключается в том, что когда я закрываю клиент VS сбрасывает первый, третий и четвертый элементы, но не 2-й элемент (Tag_XYZ). Утечка памяти, похоже, возникает при первом запуске, прежде чем я даже вызываю массив, и помните, что я использую массив только для проверки:

string Get_Tag (Tags tag)
{
    return  m_ClientType == CType_ABC ? TagData[tag].strABC : TagData[tag].strAB;
}

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

также структура тегов выглядит так:

struct TagStruct
    {
        Tags tag;
        std::string strABC;
        std::string strAB;
    };

Я также хотел бы сообщить вам, что это глобальный массив, и я также пытался сделать его статическим, но продолжал получать утечку памяти, также я пытался объявить строки в массиве как "str", а не string("str") но продолжали получать утечки памяти. Да, утечка памяти является статической, что означает, что она не создается со временем, но все же лучше сохранять чистый код. Есть предложения ??

Ответы [ 2 ]

7 голосов
/ 10 ноября 2009

Это пример ложной утечки - детектор утечки видит, что выделенная память не освобождается в момент запуска детектора. Но детектор запускается до деструкторов статических объектов и, следовательно, до освобождения памяти. Вот почему это утечка с точки зрения детектора, но на самом деле это не утечка.

1 голос
/ 10 ноября 2009

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

...