【问题标题】:Assigning an Array to Another Array on the Heap C++将一个数组分配给堆 C++ 上的另一个数组
【发布时间】:2013-09-28 19:52:29
【问题描述】:

T 是 = 到 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]++;
}

【问题讨论】:

  • 向量向量向量向量向量
  • 这两行放在一起没有意义:values_[n] = tmpe; delete [] tmpe;
  • 你没有删除它是正确的。可以这样想:您正在分配一个新的内存块来保存 n+1 个值,然后填充它。然后删除旧的内存块,并将 values[n] 指向新创建的内存块。不要删除那个新块!顺便说一句,@AlanStokes 是正确的。使用向量。整个块看起来像这样:values[n].push_back(val);

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


【解决方案1】:

问题是您保留了指向tmpe 的指针,但立即释放了内存:

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

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

tmpd 也是如此。

如果你用std::vector,就不用担心这样的问题了。

【讨论】:

  • 好的,谢谢,这是一个漫长的夜晚,由于某种原因我无法思考这个问题,很抱歉这是我不能使用 std 的任务
  • “这是一个我不能使用 std 的作业”——这太荒谬了——如果可以的话,试着找一个不同的老师!
【解决方案2】:

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

【讨论】:

  • C++ 中没有隐式释放内存。
  • @AlanStokes 你是对的。我没有正确解释自己。我的意思是当values_[n] = tmpdtmpd 不能再被删除,因为它没有指向任何东西。这不是它的工作原理吗?
  • 不,赋值后两个指针都指向同一个内存。你也可以delete - 但是你不能再同时使用两者。
  • @AlanStokes 所以不要在我不想再使用的指针上使用delete 我应该将它分配给0?所以就像上面的例子一样,它会是values_[n] = tmpe; tmpe = 0;?
  • 那行得通。或者只是忽略它 - 当您退出块时,tmpe 的生命周期结束并且它无害地不复存在。 (但它所指向的仍然存在。)
猜你喜欢
  • 2014-07-14
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多