Утечки памяти с помощью strtok

У меня возникают утечки памяти в valgrind с помощью strtok, и я не уверен, почему это происходит.

Возможно потеряно: 281 байт в 8 блоках.

По-прежнему достижимо: 64 байта в 1 блоке.

Я также пытался вызвать функцию с временным указателем char вместо того, который возвращается getenv, но это не помогло.

void parsePath(const char * line, vector<string> &pathing) {

    if (line == NULL)
        return;
    char * s = strdup(line);
    if (!s)
         exit(1);

    char * pch;
    pch = strtok(s, ":");
    while (pch!=NULL) {
        string tmp = string(pch);
        pathing.push_back(tmp);
        pch = strtok(NULL, ":");
    }

    free(s);
}

Я вызываю функцию в своем основном файле с помощью.

const char *pPath;
    pPath = getenv("PATH");
    if (pPath == NULL)
        perror("PATH");

    parsePath(pPath, pathing);

person Kenneth Huang    schedule 03.12.2014    source источник
comment
pPath и line должны быть const char * (строка, возвращаемая getenv, не подлежит изменению). Вместо (string)pch должно быть string(pch) (вызовите конструктор string). И вы должны убедиться, что strdup возвращает ненулевой указатель.   -  person ooga    schedule 03.12.2014
comment
Спасибо. Я внес предложенные вами изменения, но у меня все еще возникают утечки памяти. Я что-то пропустил?   -  person Kenneth Huang    schedule 03.12.2014
comment
в этом коде используется «вектор» из STL в C ++, поэтому это не C. Тег должен быть изменен с C на C ++.   -  person user3629249    schedule 03.12.2014
comment
возможно я это пропустил, но не вижу определения пути в основной функции   -  person user3629249    schedule 03.12.2014
comment
Я думаю, проблема была в том, что моя программа вышла из exit (0); Если он завершился возвратом 0, проблем с памятью не было.   -  person Kenneth Huang    schedule 03.12.2014
comment
@ooga: Для практических целей (string)pch и string(pch) одинаковы. Оба будут вызывать std:string::string(const char*), поскольку они эквивалентны static_cast<std::string>(pch)   -  person MSalters    schedule 03.12.2014


Ответы (1)


Скорее всего, это ложное срабатывание от valgrind.

В общем, утечки памяти не являются большой проблемой для современного C ++, но вы явно используете более старый стиль. Если бы вы использовали только std::string и, например, Boost.Tokenizer, утечки не будет.

person MSalters    schedule 03.12.2014