【问题标题】:Memory leaks with strtokstrtok 内存泄漏
【发布时间】:2015-01-31 13:05:48
【问题描述】:

我在使用 strtok 的 valgrind 中遇到了一些内存泄漏,我不确定为什么会这样。

可能丢失:8 个块中的 281 个字节。

仍然可以访问:1 个块中的 64 个字节。

我也尝试使用临时 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);
}

我在 main 中调用该函数。

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

    parsePath(pPath, pathing);

【问题讨论】:

  • pPathline 应该是 const char *getenv 返回的字符串不可修改)。而不是(string)pch,它应该是string(pch)(调用string 构造函数)。并且您应该确保strdup 返回一个非空指针。
  • 谢谢。我做了你建议的更改,但我仍然遇到内存泄漏。有什么我错过的吗?
  • 这段代码使用了C++中STL中的'vector',所以不是C。标签需要从C改成C++
  • 可能我错过了,但是在main函数中没有看到pathing的定义
  • 我认为问题出在我的程序从 exit(0) 退出时;如果它从返回 0 终止,则没有任何内存问题。

标签: c++ memory memory-leaks strtok


【解决方案1】:

这很可能是来自valgrind 的误报。

一般来说,内存泄漏在现代 C++ 中并不是一个大问题,但您显然使用的是旧样式。如果您只使用std::string 和例如Boost.Tokenizer,不会有任何泄漏。

【讨论】:

    猜你喜欢
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 2011-10-08
    • 2013-01-20
    • 2011-10-31
    • 2019-08-10
    相关资源
    最近更新 更多