在我的 class 中的几个数组上调用 delete[] 时获取 "heap corruption detected" - C++
Getting "heap corruption detected" while calling delete[] on couple of arrays in my class - C++
我有以下代码,我在 class 的构造函数中为三个 int* 分配内存。稍后在 class 的析构函数中将其删除。我在删除析构函数中的两个 int* 时遇到问题(我将注释放在下面的代码中,我遇到了问题):
#define CAP 3
class SetOfStacks
{
private:
int* a1;
int* a2;
int* a3;
int index = -1;
public:
void push(int data);
SetOfStacks()
{
a1 = new int[CAP];
a2 = new int[CAP];
a3 = new int[CAP];
}
~SetOfStacks()
{
delete [] a1; //This works just fine
delete [] a2; //heap corruption here
delete [] a3; //heap corruption here
}
};
void SetOfStacks::push(int data)
{
if (index >= 3 * CAP)
{
cout << "stack overflow" << endl;
return;
}
if(index>=-1 && index<=1)
{
index++;
a1[index] = data;
}
else if (index >1 && index<=4)
{
index++;
a2[index] = data;
}
else if (index >4 && index<=7)
{
index++;
a3[index] = data;
}
}
int main()
{
SetOfStacks s;
s.push(10);
s.push(20);
s.push(30);;
s.push(40);
s.push(50);
s.push(60);
s.push(70);
s.push(80);
s.push(90);
return 0;
}
我多次调试代码,但是,我不确定为什么在删除[] a2 和删除[] a3 时出现堆损坏。执行 delete[] a1 工作得很好。我在 delete[] a2 和 delete[] a3:
上收到以下错误
你知道我为什么会收到这个错误吗?是什么原因造成的(我很困惑为什么删除 a1 可以正常工作,但是删除 a2 和 a3 会出现这个错误 - 尽管它们在代码中几乎经历了相同的逻辑)?
你所有的数组的长度都是 CAP
,也就是 3
(根据你的 if 语句判断),但是你在写入数组时没有相对化你的索引。
else if (index >4 && index<=7)
{
index++;
a3[index] = data;
}
在这些行中,您可以将最多 8
的索引写入数组。
这就是您收到错误的原因:
CRT detected that the application wrote to memory after end of heap buffer.
您可以在使用 index % CAP
写入索引时使用模运算符来解决此问题。
为了使其与任何 CAP
一起正常工作,您的 if 语句也应使用 >= N * CAP
作为边界。
else if (index >= 2 * CAP) // no upper check needed in an if-else chain
{
a3[index++ % CAP] = data; // you can also do index++ after
}
index
超出了您的数组范围:
if(index>=-1 && index<=1)
{
index++;
a1[index] = data; // index can be 0, 1 or 2 (fine)
}
else if (index >1 && index<=4)
{
index++;
a2[index] = data; // index can be 3, 4 or 5 (all out of range)
// This fixes it:
// a2[index - 3] = data; // index can now only be 0, 1 or 2
}
else if (index >4 && index<=7)
{
index++;
a3[index] = data; // index can be 6, 7 or 8 (all out of range)
// This fixes it:
// a3[index - 6] = data; // index can now only be 0, 1 or 2
}
我还建议使条件更能代表所使用的实际索引,以便更容易发现此类错误:
if(0 <= index && index < 3) {
a1[index++] = data;
} else if (index < 6) {
a2[index++ - 3] = data
} else if (index < 9) {
a3[index++ - 6] = data;
}
我有以下代码,我在 class 的构造函数中为三个 int* 分配内存。稍后在 class 的析构函数中将其删除。我在删除析构函数中的两个 int* 时遇到问题(我将注释放在下面的代码中,我遇到了问题):
#define CAP 3
class SetOfStacks
{
private:
int* a1;
int* a2;
int* a3;
int index = -1;
public:
void push(int data);
SetOfStacks()
{
a1 = new int[CAP];
a2 = new int[CAP];
a3 = new int[CAP];
}
~SetOfStacks()
{
delete [] a1; //This works just fine
delete [] a2; //heap corruption here
delete [] a3; //heap corruption here
}
};
void SetOfStacks::push(int data)
{
if (index >= 3 * CAP)
{
cout << "stack overflow" << endl;
return;
}
if(index>=-1 && index<=1)
{
index++;
a1[index] = data;
}
else if (index >1 && index<=4)
{
index++;
a2[index] = data;
}
else if (index >4 && index<=7)
{
index++;
a3[index] = data;
}
}
int main()
{
SetOfStacks s;
s.push(10);
s.push(20);
s.push(30);;
s.push(40);
s.push(50);
s.push(60);
s.push(70);
s.push(80);
s.push(90);
return 0;
}
我多次调试代码,但是,我不确定为什么在删除[] a2 和删除[] a3 时出现堆损坏。执行 delete[] a1 工作得很好。我在 delete[] a2 和 delete[] a3:
上收到以下错误你知道我为什么会收到这个错误吗?是什么原因造成的(我很困惑为什么删除 a1 可以正常工作,但是删除 a2 和 a3 会出现这个错误 - 尽管它们在代码中几乎经历了相同的逻辑)?
你所有的数组的长度都是 CAP
,也就是 3
(根据你的 if 语句判断),但是你在写入数组时没有相对化你的索引。
else if (index >4 && index<=7)
{
index++;
a3[index] = data;
}
在这些行中,您可以将最多 8
的索引写入数组。
这就是您收到错误的原因:
CRT detected that the application wrote to memory after end of heap buffer.
您可以在使用 index % CAP
写入索引时使用模运算符来解决此问题。
为了使其与任何 CAP
一起正常工作,您的 if 语句也应使用 >= N * CAP
作为边界。
else if (index >= 2 * CAP) // no upper check needed in an if-else chain
{
a3[index++ % CAP] = data; // you can also do index++ after
}
index
超出了您的数组范围:
if(index>=-1 && index<=1)
{
index++;
a1[index] = data; // index can be 0, 1 or 2 (fine)
}
else if (index >1 && index<=4)
{
index++;
a2[index] = data; // index can be 3, 4 or 5 (all out of range)
// This fixes it:
// a2[index - 3] = data; // index can now only be 0, 1 or 2
}
else if (index >4 && index<=7)
{
index++;
a3[index] = data; // index can be 6, 7 or 8 (all out of range)
// This fixes it:
// a3[index - 6] = data; // index can now only be 0, 1 or 2
}
我还建议使条件更能代表所使用的实际索引,以便更容易发现此类错误:
if(0 <= index && index < 3) {
a1[index++] = data;
} else if (index < 6) {
a2[index++ - 3] = data
} else if (index < 9) {
a3[index++ - 6] = data;
}