数组中的内存错误调整大小

时间:2014-02-11 07:58:32

标签: c++ heap

所以我正在尝试为堆创建一个模板类。我试图不使用任何STL类(教授的规则和诸如此类的东西),而不是使用向量我使用动态分配的数组。但是,当我运行程序并将足够的数据输入堆中以触发调整大小功能时,它会产生一堆内存错误。一些gdb工作将其缩小到这个函数:

template <class T>
T* Heap<T>::resize()
{
    T* temp; //temp variable for storage

    heap_capacity *= 2; //double capacity
    temp = new T[heap_capacity]; //create new enlarged array
    for (int i = 0; i < heap_size; ++i)
    {
        temp[i] = heap_arr[i]; //copy elements from previous array to current
    }
    delete [] heap_arr; //delete old array
    return temp; //return new array
}

相当标准的东西,tbh。它要求T具有赋值运算符,但我使用普通的旧整数进行测试。这不是我第一次编写这段代码,但这是我第一次为模板编写代码。问题出在这个函数中,还是在其他地方?

编辑:我在gdb中使用了更多代码。在为temp分配内存后立即输出程序错误。这很奇怪,因为我对构造函数中的原始heap_array做了同样的事情。我会更多地讨论,但是我的语法错误的“新”声明? heap_capacity是有效的,顺便说一句,所以这不是问题......

2 个答案:

答案 0 :(得分:6)

看起来您需要将heap_arr设置为指向新的扩展内存。 resize方法处理这个问题肯定是有道理的:

delete [] heap_arr;
heap_arr = temp;
return heap_arr;

您还需要确保heap_size小于heap_capacity

答案 1 :(得分:1)

好吧,我已经弄明白为什么我会收到错误。结果我检查看堆的大小是否等于容量忘记了一个关键部分:数组顶部的额外0。堆是从1开始的(而不是从0开始)所以修复很简单:将heap_size == heap_capacity语句更改为heap_size == heap_capacity-1 ......这是一个重要的区别。谢谢大家的帮助。