Char *内存泄漏问题

3

我有一个问题,无法确定程序中导致内存泄漏的原因。以下是我正在运行的代码:

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 && pwd”,其中“ls”、“&&”和“pwd”是“commands”中单独的索引。 - mas4
这个做法有点不清晰,因为你总是先删除这些项,这样你就更或多少保证它没有指向任何东西。 - Willem Van Onsem
2
请使用向量,避免所有的new/delete问题。这是一个非常类似C语言的解决方案,适用于C++代码。 - Michael Dorgan
1
你有没有可能在未显示的 //... 代码中意外地重用或重置了 k - TheUndeadFish
如果你只想将char *传递给execvp(),那么只需使用const_cast<>。 - Sam Varshavchik
显示剩余5条评论
2个回答

2

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


1

我是c++的新手,但您应该按以下方式声明输入

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

这是正确的方法还是只是风格问题?如果我这样做,我的明确丢失的内存会显著增加。而且,在更改此行代码之前泄漏的相同数量的内存从“明确丢失的内存”变为“间接丢失的内存”。 - mas4
这是正确的方式,您正在动态分配内存,实际上您可以这样做: char **input=new char*[commands.size()];也许999不够大。 - Jonathan Arley Monsalve Salaza
然而,command.size()可能不够大,因为你正在第二个for循环中增加k(如果找到空格),所以问题是command.size()有多大? - Jonathan Arley Monsalve Salaza
问题是为什么您在最后删除输入,您每个第k次迭代只使用最后一个单词吗?delete[] input[z] - Jonathan Arley Monsalve Salaza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接