我有一个有序的数组列表。在我的resize函数中,我创建一个新数组并为其分配旧数组的值,然后使用delete[] arrayname;
删除旧数组。
每当调整大小功能发挥作用时,这会在运行时导致错误。调用dbgheap.c。有没有人见过这个?
这是我的代码:
//--------------------------------------------------------------------------------------------
// Name: OrderedArray.h.
// Description: Header file for the use in OrderedArray.cpp.
//--------------------------------------------------------------------------------------------
#ifndef ORDEREDARRAY_H
#define ORDEREDARRAY_H
#include <iostream>
using namespace std;
//--------------------------------------------------------------------------------------------
// Name: template <class Datatype>
// Description:
//--------------------------------------------------------------------------------------------
template <class Datatype>
//--------------------------------------------------------------------------------------------
// Class: OrderedArray.
//--------------------------------------------------------------------------------------------
class OrderedArray
{
//--------------------------------------------------------------------------------------------
// Member Variables.
//--------------------------------------------------------------------------------------------
private:
Datatype* m_array;
int size;
int g_size;
int num_elements; //Counter for the number of elements in the Array.
void Resize(int p_size)//resizes the array to the size of p_size
{
cout << "Did i get this far ";
if(p_size < 0)//checks if new size is less than 0
{
cout << "ERROR! Size of an array can not be less than 0!" << endl;
}
else//else its ok to continue
{
Datatype* newArray = new Datatype[p_size];//creates a pointer newArray that points at a new array
if(newArray == 0)
{
return;
}
cout << "Did i get this far ";
int min;
if(p_size < size)//checks the if the new array is smaller than the old one
min = p_size;
else//else its going to be bigger
min = size;
cout << "Did i get this far ";
int index;
int temp = num_elements;//puts num_elements into a temporary variable called temp
num_elements = 0;//num_elements is set to 0
for(index = 0; index < min; index++)
{
newArray[index] = m_array[index];//places everything from the old array into the new array that will fit.
if(num_elements < temp)//if the num_elements is less than temp(the original num_elements)
{
num_elements++;//increment num_elements. This will keep incrementing to create the new num_elements based the number of elements cut off in the resize
}
}
size = p_size;//sets the old size to be equal to the new size
cout << "Did i get this far ";
if(m_array != 0)
{
cout << "\nI am just about to delete ";
delete[] m_array;//deletes the old array
}
m_array = newArray;//makes m_array point at the new array
newArray = 0;//makes newArray a null pointer
}
}
//---------------------------------------------------------------------------------------
// Name: Push
// Description:
//---------------------------------------------------------------------------------------
void push(Datatype p_item)
{
if(num_elements == size)//checks if the array is full and needs to be resized
{
Resize(size + g_size);//calls the resize function
}
int pos = num_elements;
for(int x=0;x<num_elements;x++)
{
if(p_item < m_array[x])
{
pos=x;
}
}
//loops through the array from high to low moving all values to the right
//to make space for the passed in value until it gets to the right place
for(int index = num_elements; index >= pos; index--)
{
m_array[index] = m_array[index-1];//moves the values to the right
}
m_array[pos] = p_item;//the passed in value is positioned into its ordered position
num_elements++;
cout<< "Num Elements " << num_elements;
cout<< "Size " <<size;
}
//--------------------------------------------------------------------------------------------
// Name: Constructor.
// Description: Constructs the Array.
//--------------------------------------------------------------------------------------------
OrderedArray(int p_size, int grow_size)
{
//Sets the Array size.
m_array = new Datatype[p_size,grow_size];
size = p_size;
g_size = grow_size;
//How many elements are in the Array.
num_elements = 0;
}
// size和g_size由程序开头的用户给出它的值。
答案 0 :(得分:4)
这里可能还有其他问题,但我能看到的最明显的事情就是:
for(int index = num_elements; index >= pos; index--)
{
m_array[index] = m_array[index-1];
}
如果pos
恰好为零,您最终会这样做:
m_array[0] = m_array[-1];
此问题会立即显示(当num_elements
为零时 - 您尚未显示构造函数,但我希望您初始化所有内容)。
在循环中将>=
更改为>
可能会解决您的所有麻烦。
从概念上讲,你应该同意这个逻辑。当您要将 m_array[pos]
前的项目 m_array[pos]
转发到m_array = new Datatype[p_size,grow_size];
时,无法将该项目替换为新项目。
[edit] 现在您已经发布了构造函数:
grow_size
由于逗号运算符的工作方式,这将使用p_size
而不是m_array = new Datatype[p_size];
初始化数组。阅读:How does the Comma Operator work
请改为:
{{1}}
答案 1 :(得分:1)
构造函数中的代码m_array = new Datatype[p_size,grow_size];
应该只接受一个与数组大小相同的参数。
更改为:m_array = new Datatype[p_size];