所以我正在尝试为堆创建一个模板类。我试图不使用任何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是有效的,顺便说一句,所以这不是问题......
答案 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
......这是一个重要的区别。谢谢大家的帮助。