字符*数组内存泄漏

时间:2015-05-12 07:18:17

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

我在解除分配我在char*数组中使用的内存时遇到问题。在下面的代码片段中,我创建了一个名为char*的{​​{1}}数组,该数组一次保存指向单个单词的指针,后跟数组末尾的指针input。这是唯一一次(我相信)我在代码中分配内存。

NULL

稍后,我尝试使用以下代码片段取消分配此内存:

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] = new char[1]; //add the NULL char *
    input[k] = NULL;
    ...

我正在遍历我的for(int z = 0; z < k; z++) { delete[] input[z]; } 数组并删除在每个索引处分配的内存。不使用这个片段,valgrind告诉我内存泄漏。使用这个片段,valgrind告诉我比以前更少的内存泄漏。我仍然坚持仍然肯定丢失的内存问题

我不确定我缺少什么来删除剩余的已分配内存(或者如果其余内存泄漏的原因实际上是我的代码中的其他地方)。我感谢任何帮助,建议和提示。

2 个答案:

答案 0 :(得分:4)

我认为,你的问题在于以下情况,

input[k] = new char[1]; //add the NULL char *
input[k] = NULL;

此处,在没有free - input[k]的情况下,您正在为其分配NULL。因此,之前的input[k]将丢失。

如果你真的希望input[k]持有NULL,(可能作为哨兵价值),你可以做到

input[k] = NULL;

无需单独分配内存。

答案 1 :(得分:2)

你不需要在它所说的input[k] = new char[1]; //add the NULL char *的位置创建一个新的字符。只需保留NULL赋值,它应该可以正常工作。