The purpose of the program that I’m working on is creating a class to “improve” the default integer array data type by simulating a dynamic array of pointers. I keep running into errors when trying to delete pointers and arrays of pointers where it says “Windows has triggered a breakpoint in project4.exe.
This may be due to a corruption of the heap, which indicates a bug in project4.exe or any of the DLLs it has loaded.
This may also be due to the user pressing F12 while project4.exe has focus.
The output window may have more diagnostic information.”
class Array
{
private:
int length;
int* data;
public:
Array();
Array(const Array &cpy);
~Array();
bool addint(int toadd);
bool deletelast();
int getlength();
friend ostream& operator<<(ostream &out, const Array &n);
};
ostream& operator<<(ostream &out, const Array &n);
Array::Array()
{
length = -1;
data = NULL;
}
Array::Array(const Array &cpy)
{
length = cpy.length; //value of length is copied
if (length < 0)
data = NULL;
else
{
data = new int [length];
for (int i=0; i<=length; i++)
data[i] = cpy.data[i];
}
}
Array::~Array()
{
if (length != 0)
delete [] data;
else
delete data;
data = NULL;
}
bool Array::addint(int toadd)
{
length ++;
int* point = new int[length];
for (int i=0; i < length; i++)
point[i] = data[i];
point[length] = toadd;
if (length != 0)
delete [] data;
data = point;
point = NULL;
return true;
}
bool Array::deletelast()
{
int* temppoint;
if (length > 0)
temppoint = new int [length-1];
else
temppoint = new int[0];
for (int i=0; i<length; i++)
temppoint[i] = data[i];
if (length == 0)
temppoint[0] = 0;
length --;
delete [] data;
data = temppoint;
temppoint = NULL;
return true;
}
void menu(Array var)
{
int selection=0,
input;
bool success;
Array* arrcpy;
while (selection != 3)
{
if (var.getlength() == -1)
{
cout << "What would you like to demonstrate?" << endl << "1) Add an integer " << endl
<< "2) Exit" << endl << "Enter your selection: ";
cin >> selection;
if (selection == 2)
selection = 4;
}
else
{
cout << endl << "Now what would you like to demonstrate?" << endl << "1) Add an integer " << endl
<< "2) Delete the last entered integer" << endl << "3) Copy constructor" << endl << "4) Exit" << endl << "Enter your selection: ";
cin >> selection;
}
if (selection==1)
{
cout << endl << "The length of the array before adding a new value is: " << var.getlength() + 1 << endl;
cout << "Please enter the integer that you wish to add: ";
cin >> input;
success = var.addint(input);
if (success)
cout << endl << "The data input was a success!" << endl << "The length of the array is now: "
<< var.getlength() + 1 << endl << "The new value of the array is: " << var << endl;
else
cout << endl << "The input failed" << endl;
}
if (selection == 2)
{
cout << endl << "The lenght of the array before the deletion is: " << var.getlength() + 1 << endl
<< "and the value held in the array is: " << var << endl;
success = var.deletelast();
if (success)
cout << endl << "The data deletion was a success!" << endl << "The length of the array is now: "
<< var.getlength() + 1 << endl << "The new value of the array is: " << var << endl;
else
cout << endl << "The deletion failed" << endl;
}
if (selection == 3)
{
cout << endl << "The lenght of the array being copied is: " << var.getlength() + 1 << endl
<< "and the value held in the array is: " << var << endl;
arrcpy=new Array(var);
cout << endl << "The length of the copied array is: " << arrcpy->getlength() +1 << endl
<< "and the value contained in the array is: " << *arrcpy;
delete arrcpy;
}
}
}
This is all of the relevant source code that I have in terms of the issue that I’m having. It’s coming up that every instance of the delete operator and the delete [] operator has resulted in this breakpoint error and I’m not sure what I’m doing wrong.
Edit: Rewrote the code to have the value of length default to 0 instead of -1 and everything works now!
Since your length starts at -1, the first call of this line would be to do
new int[0]. Could be the problem.. If you insist on not fixing the semantics oflength, you wantlength+1hereUnrelated point, you should look at how
std::vectordoes it, instead of reallocating every addition, you should try overallocating and only reallocating if the space is filled.