【问题标题】:Char * w/ Memory Leak字符 * 带内存泄漏
【发布时间】:2026-02-23 17:55:02
【问题描述】:

我在确定程序中导致内存泄漏的原因时遇到问题。下面是我正在运行的代码:

char *input[999];
//exec commands
for(unsigned int i = 0; i < commands.size(); i++)
{
    string current = "";
    string word = "";
    int k = 0;
    for(unsigned int j = 0; j < commands.at(i).size(); j++) //iterate through letters
    {
        current = commands.at(i);
        //cout << "current: " << current << endl;
        if(current[j] == ' ')
        {
            input[k] = new char[word.size() + 1];
            strcpy(input[k], word.c_str());
            k++;
            word = "";
        }
        else
            word += current[j]; //add letter
        //cout << "word: " << word << endl;
    }
    input[k] = new char[word.size() + 1];
    strcpy(input[k], word.c_str());
    k++;

    input[k] = NULL;

    //...
    //...

    for(int z = 0; z <= k; z++)
    {
        delete[] input[z];
    }
}

通过 valgrind 运行这段代码,我发现我的内存肯定丢失了。为了尝试重新创建场景并进行调试,我在此处提供了上述代码的较小规模版本:

int main()
{
    char* var[999];
    string s = "1234";

    var[0] = new char[4 + 1];
    strcpy(var[0], s.c_str());

    delete [] var[0];
    return 0;
}

根据 valgrind,此代码没有任何内存泄漏。我在原始代码中没有取消分配什么?我的测试代码在做什么而我的原始代码没有做什么?谢谢,感谢您的帮助。

【问题讨论】:

  • commands 是一个包含单独 bash 命令(存储为字符串)的向量。它将持有ls &amp;&amp; pwd,其中ls&amp;&amp;pwdcommands 中的单独索引。
  • 没有直接关系,但我猜你想在删除循环中表达 z &lt; k 而不是 z &lt;= k :)
  • 我不想在k 处一直迭代到最后吗?我在索引k 做的最后一件事是input[k] = NULL。对它进行delete 没有影响吗?
  • 请只使用一个向量,避免所有新的/删除的麻烦。这是一个非常类似于 C 的 C++ 代码解决方案。
  • 您是否有可能在未显示的//... 代码中的某处意外重用或重置k

标签: c++ arrays memory-leaks valgrind dynamic-memory-allocation


【解决方案1】:

如果您打算稍后在代码中对其使用 delete[],通常需要用 new 声明您的 char*。看起来只是一个简单的错误。

【讨论】:

    【解决方案2】:

    我是 C++ 新手,但您应该按如下方式声明输入

    char **input=new char*[999];
    

    【讨论】:

    • 这是正确的做法还是只是风格问题?如果我这样做,我肯定失去的记忆会显着增加。此外,在更改这行代码之前泄漏的相同数量的内存从绝对丢失的内存转换为间接丢失的内存。
    • 这是正确的方法,你正在动态分配内存,实际上你可以这样做:char **input=new char*[commands.size()]; 也许 999 还不够大
    • 但是 command.size() 不够大,因为你在 de 秒内增加 k (如果找到空间)所以问题是 command.size() 有多大?
    • 问题是你为什么要在最后删除输入,你是不是在每 k 次迭代中只使用最后一个单词? delete[] input[z]