我有一个用c ++创建一个Arraylist(来自1d数组)的任务,我让每个方法都运行,但我在我的数组中得到一个奇怪的值,我没有加入。基本上我发生的事情就是当我添加到我的数组,如果我的数组中的项数等于数组的长度我加倍数组的大小。好吧,当我的数组长度达到length = 8时,在arr [6]中有一个值为33.这是一个内存问题吗?这个地方应该是0。
这是我的cpp:
#include<iostream>
#include<string>
#include<sstream>
#include "ArrayList.h"
using namespace std;
void ArrayList:: intialArr(int arr[])
{
cout << "intialArr ran" << endl;
for(int i = 0; i < length; i++)
{
arr[i] = 0;
}
}
std::string ArrayList:: toString()
{
cout << "{ ";
for(int i = 0; i < capacity; i++)
{
cout << "arr[" << i << "] = " << arr[i] << " ";
}
cout << " }";
}
ArrayList::ArrayList()
{
length = 1;
capacity=0;
arr = new int[length];
cout << "length = " << length << " " << "capacity = " << capacity << endl;
intialArr(arr);
cout << "ArrayList created"<<endl;
}
int& ArrayList:: operator[] (unsigned int i)
{
cout << "operator[] is working" << endl;
int *p = &arr[i];
return *p;
}
void ArrayList:: push_back(int m)
{
if(capacity>=length)
{
length = length*2;
cout << "length = " << length << endl;
int* curArr = new int[length];
intialArr(curArr);
for (int i = 0; i<length; i++)
{
if(arr[i])
{
cout << "arr[" << i << "] in pushback method(if) is: " << arr[i]<< endl;
curArr[i] = arr[i];
}
else
{
cout << "arr[" << i << "] in pushback method(else) is: " << arr[i] << endl;
curArr[i] = 0;
}
}
delete [] arr;
arr = curArr;
}
for(int i = 0; i < length; i++)
{
if(arr[i]==0)
{
arr[i] = m;
capacity++;
cout << "arr at " << i << " is: " << arr[i];
cout << " and should be: " << m << endl;
cout << "capacity is: " << capacity << endl;
break;
}
}
}
void ArrayList:: erase(int m)
{
for(int i = 0; i < length; i++)
{
if(arr[i]==m)
{
for(int j = i; j<length; j++)
{
arr[j] = arr[j+1];
cout<< "arr[" << j << "] is: " << arr[j] << " and should be: ";
cout << arr[j+1] << endl;
}
capacity--;
cout << "capacity is: " << capacity << endl;
}
}
if((length/capacity) == 2)
{
length = length/2;
cout << "length = " << length << endl;
int* curArr = new int[length];
intialArr(curArr);
for (int i = 0; i<length; i++)
{
if(arr[i])
{
cout << "arr[" << i << "] in pushback method(if) is: " << arr[i]<< endl;
curArr[i] = arr[i];
}
else
{
cout << "arr[" << i << "] in pushback method(else) is: " << arr[i] << endl;
curArr[i] = 0;
}
}
delete [] arr;
arr = curArr;
}
}
int main()
{
ArrayList arr;
arr.push_back(1);
arr.push_back(1);
arr.push_back(1);
arr.push_back(1);
arr.push_back(1);
arr.push_back(1);
}
这是我的数组的结果:
arr[0] in pushback method(if) is: 1
arr[1] in pushback method(if) is: 1
arr[2] in pushback method(if) is: 1
arr[3] in pushback method(if) is: 1
arr[4] in pushback method(if) is: 1
arr[5] in pushback method(if) is: 1
arr[6] in pushback method(if) is: 33
arr[7] in pushback method(else) is: 0
并且不允许任何向量,当我尝试硬编码arr [6] = 0时,我得到一个非常奇怪的错误。
答案 0 :(得分:2)
push_back()
中的以下代码块导致未定义的行为,因为您正在访问arr
越界。
for (int i = 0; i<length; i++)
{
if(arr[i])
{
cout << "arr[" << i << "] in pushback method(if) is: " << arr[i]<< endl;
curArr[i] = arr[i];
}
else
{
cout << "arr[" << i << "] in pushback method(else) is: " << arr[i] << endl;
curArr[i] = 0;
}
您需要保存旧的长度,使用旧的长度将数据从arr
复制到curArr
,然后继续将输入参数添加到新数组中。
另外,检查:
if(arr[i]==0)
只要您不将0
推送到阵列,就可以了。
我会将push_back
修改为:
void ArrayList:: push_back(int m)
{
if(capacity>=length)
{
int oldLength = length;
length = length*2;
cout << "length = " << length << endl;
int* curArr = new int[length];
intialArr(curArr);
for (int i = 0; i < oldLength; i++)
{
curArr[i] = arr[i];
}
delete [] arr;
arr = curArr;
}
arr[capacity] = m;
capacity++;
}