Heap Corruption Error

Hi all,

I am working on a simple program using dynamic arrays. The program adds two positive integers in dynamic character arrays and stores the sum into a dynamic character array. However, I am getting a "Heap Corruption Detected" error. From a few Google searches, I have found that basically this error means that I am writing to memory that I have not allocated space for, more or less. The IDE I am using is Microsoft Visual C++ 2010 Express. I have tried multiple ways of doing this program and each way works for a few inputs, but then it seems like the error comes when the input is a large integer. I would appreciate if someone with more experience in debugging would look at my code and possibly tell me why I am getting this error, as well as possibly where the error is. Thank you for your time.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#include <iostream>
#include <string>
#include <cstring>

#define CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

//Type Definitions
//===============================================================
typedef char* CharArrayPtr;
//===============================================================

//Function Prototypes
//===============================================================
bool finished();
void getNum(CharArrayPtr &);
void align(CharArrayPtr &, CharArrayPtr &);
void add(CharArrayPtr, CharArrayPtr, CharArrayPtr &);
void output(CharArrayPtr);
//===============================================================

int main()
{
	using namespace std;

	CharArrayPtr num1, num2, sum;

	cout << "This is a program that adds two positive integers.\n\n";

	do
	{
		cout << "Enter the first integer.\n";
		getNum(num1);
		cout << endl;
		cout << "Enter the second integer.\n";
		getNum(num2);
		cout << endl;

		align(num1, num2);
		add(num1, num2, sum);
		output(sum);

	}while(!finished());

	delete [] num1;
	delete [] num2; //This is where the error occurs
	delete [] sum;

	_CrtDumpMemoryLeaks();

	return 0;
}

//Function Definitions
//===============================================================
bool finished()
{
	using namespace std;

	string answer;

	do
	{
		cout << "Would you like to repeat the program? (Y/N): ";
		getline(cin, answer);
		cout << endl;

		if( (answer.find_first_not_of("YyNn") != string::npos) || (answer.length() > 1) )
			cout << "Response is not valid!\n";

	}while( (answer.find_first_not_of("YyNn") != string::npos) || (answer.length() > 1) );

	if(answer.find_first_of("Yy") != string::npos)
		return false;

	return true;
}
void getNum(CharArrayPtr &arr)
{
	using namespace std;

	char ch;
	int size(5), index(0);

	arr = new char[size];

	cin.get(ch);
	while(ch != '\n')
	{
		if(index == size)
		{
			CharArrayPtr temp = new char[size + 5];
			strncpy(temp, arr, index);
			temp[index] = ch;
			size += 5;
			index++;
			delete [] arr;
			arr = temp;
		}
		else
		{
			arr[index] = ch;
			index++;
		}

		cin.get(ch);
	}

	arr[index] = '\0';
}
void align(CharArrayPtr &n1, CharArrayPtr &n2)
{
	if(strlen(n1) > strlen(n2))
	{
		int difference = strlen(n1) - strlen(n2), tempIndex = 0, n2Index = 0;
		CharArrayPtr temp = new char[strlen(n1) + 1];

		while(tempIndex < difference)
		{
			temp[tempIndex] = '0';
			tempIndex++;
		}

		while(n2[n2Index] != '\0')
		{
			temp[tempIndex] = n2[n2Index];
			tempIndex++;
			n2Index++;
		}

		delete [] n2;
		n2 = temp;
		n2[tempIndex] = '\0';
	}
	else if(strlen(n2) > strlen(n1))
	{
		int difference = strlen(n2) - strlen(n1), tempIndex = 0, n1Index = 0;
		CharArrayPtr temp = new char[strlen(n2) + 1];

		while(tempIndex < difference)
		{
			temp[tempIndex] = '0';
			tempIndex++;
		}

		while(n1[n1Index] != '\0')
		{
			temp[tempIndex] = n1[n1Index];
			tempIndex++;
			n1Index++;
		}

		delete [] n1;
		n1 = temp;
		n1[tempIndex] = '\0';
	}
}
void add(CharArrayPtr n1, CharArrayPtr n2, CharArrayPtr &sum)
{
	int answer, carry(0);

	sum = new char[strlen(n1) + 1];

	for(int index = strlen(n1) - 1; index >= 0; index--)
	{
		answer = (n1[index] - '0') + (n2[index] - '0') + carry;
		if(answer >= 10)
		{
			answer -= 10;
			carry = 1;
		}
		else
			carry = 0;

		sum[index] = answer + '0';
	}

	if(carry == 1)
	{
		CharArrayPtr temp = new char[strlen(n1) + 2];
		int tempIndex = 0, index = 0;
		temp[tempIndex] = carry + '0';
		tempIndex++;

		while(index < strlen(n1))
		{
			temp[tempIndex] = sum[index];
			index++;
			tempIndex++;
		}

		delete [] sum;
		sum = temp;
		sum[tempIndex] = '\0';
		return;
	}

	sum[strlen(n1)] = '\0';
}
void output(CharArrayPtr sum)
{
	using namespace std;

	cout << "The sum of the integers is\n";
	for(int index = 0; index < strlen(sum); index++)
		cout << sum[index];
	cout << endl << endl;
}
//=============================================================== 
Last edited on
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//getNum()
	while (ch != '\n')
	{
		if (index == size)
		{
			CharArrayPtr temp = new char[size + 5];
			strncpy (temp, arr, index);
			temp[index] = ch;
			size += 5;
			index++;
			delete[] arr;
			arr = temp;
		}
		else
		{
			arr[index] = ch;
			index++; //¿what if `index' == `size' here?
		}

		cin.get (ch); //and now you read a '\n'
	}

	arr[index] = '\0'; //out of bounds access 


> the error comes when the input is a large integer.
¿by instance?

> someone with more experience in debugging
¿have you at least tried to run it through a debugger?
I would point you to the line where it crashes, we can analyse from there.
Last edited on
Yes, I've run the program through a debugger with no success in pinpointing where the error is. So I just scrapped the whole thing and we wrote it, being careful to make sure that each allocation is accounted for. Thank you for the reply and help.
Topic archived. No new replies allowed.