c++ - 将一个数组分配给堆 C++ 上的另一个数组

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

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

问题出现在 if 语句中,当我尝试删除 tmpe 时出现错误。如果我注释掉 delete 语句,代码会运行,但它只是将我在 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]++;
}

最佳答案

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

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

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

tmpd 也是如此。

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

关于c++ - 将一个数组分配给堆 C++ 上的另一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18967361/

相关文章:

c++ - fstream get 方法的行为不一致

c# - 俄罗斯方 block 游戏的朴素重力使用 2D 阵列作为运动场

c# - 二维数组中选定元素的总和(盒子形状?)

memory - 内在 memcmp

c++ - 如果我的 VBO 类引用顶点数组,数据是否仍存储在 GPU 上?

C++ 使用 using 关键字避免派生类中的动态调度

c++ - 弃用从字符串常量到 'char*' 的转换 : Can't use the constant

PHP:忽略键并提取数组的值

c# - 确定何时释放一些内存的简单算法.Net

c - 无法从函数中释放指针