在堆C ++上将数组分配给另一个数组

时间:2013-09-23 19:35:04

标签: c++ arrays memory heap delete-operator

T is = to char
counts_是存储在堆上的整数数组 values_是堆上的数组数组

问题到达if语句,当我尝试删除tmpe时出现错误。如果我将删除语句注释掉,代码就会运行,但它只是将values_中的所有指针指向同一个数组。代码的想法是创建一个包含所选values_数组之一的值的新数组,然后为其添加一个额外的值。然后将其重新分配回我从中获取的values_数组中的位置。 tmpe数组保持正确的值,直到我尝试删除指向它的指针。运行我的整个程序时出现Aborted(core dumped)错误。

if (initialized(n) == true)
{   
    T *tmpe = new T[counts_[n] + 1];
    for (size_type i = 0; i < counts_[n]; i++)
    {
        tmpe[i] = values_[n][i];
    }
    tmpe[counts_[n]] = val;
    delete [] values_[n];
    values_[n] = tmpe;
    delete [] tmpe;
    counts_[n]++;
}
else
{
    T *tmpd = new T[counts_[n] + 1];
    tmpd[counts_[n]] = val;
    delete [] values_[n];
    values_[n] = tmpd;
    delete [] tmpd;
    counts_[n]++;
}

2 个答案:

答案 0 :(得分:2)

问题是你保留一个指向tmpe的指针,但是会立即释放内存:

values_[n] = tmpe;
delete [] tmpe;

当下一次迭代尝试访问和/或删除values_[n]时,它是一个悬空指针。

tmpd同样如此。

如果您使用std::vector,则无需担心此类问题。

答案 1 :(得分:-1)

重新分配tmpd以指向它后,您无需删除values_。一旦重新分配它,内存就会被释放。发生的事情是你试图释放一些不存在的东西。