背景:
今天在学习计排序算法时,遇见一个HEAP CORRUPTION DETECTED: after Normal block的问题,如图所示:
一直纳闷,我使用了new之后,使用delete[]为什么会出现这样的错误,于是求助度娘。
解决方法:
在申请内存的时候,申请大一些,就能解决这个问题。参考的方法是这个博主的:https://www.cnblogs.com/pengkunfan/p/3828874.html
代码如下:
void CCountSort::sort(vector<int> &vec)
{
printf("排序前:");
Print(vec);
int count = 10;
int *countArr = new int[count+1];
memset(countArr, 0, (count+1) * sizeof(int));
for (int i = 0; i < vec.size(); ++i)
{
countArr[vec[i]]++;
}
不稳定排序
//vec.clear();
//for (int j = 0; j < 10; ++j)
//{
// while (countArr[j]-- > 0)
// vec.push_back(j);
//}
//稳定排序
for (int k = 1; k < count; ++k)
countArr[k] = countArr[k] + countArr[k - 1];
int size = vec.size();
int *newVecArr = new int[size];
memset(newVecArr, 0, size * sizeof(int));
for (int j = vec.size() - 1; j >= 0; --j)
{
int countArrPos = vec[j];
//使用错误代码,会导致赋值的时候,操作了申请的内存空间
//int newVecArrPos = countArr[countArrPos]--;//错误代码,而且这样写的排序也是有误的
int newVecArrPos = --countArr[countArrPos];//正确代码
newVecArr[newVecArrPos] = vec[j];
}
vec.clear();
for (int m = 0; m < size; ++m)
{
vec.push_back(newVecArr[m]);
}
delete[] newVecArr;
newVecArr = NULL;
delete[] countArr;
countArr = NULL;
printf("排序后:");
Print(vec);
}