声明 double* 数组时出现损坏的堆错误
Corrupted heap error when declaring a double* array
我目前正在研究两个矩阵的平方距离之和,数据保存在 double* 数组中。 它们中的第一个保持不变,而另一个则使用在两个索引之间返回 32x32 数组的函数循环。
但是,当我尝试在"e"的第一个增量之后调用"getTile(d,e)"时,它会引发堆损坏异常:
double* Matrix::ssd(int i, int j, Matrix& rhs){
double sum = 0, val = 0; int g = 0, h=0;
double* bestMatch = new double[32*32]; double* sameTile = new double[32*32]; double* changeTile = new double[32*32];
for(int x = i-32; x <i; x++){
for(int y = j-32; y <j; y++){
sameTile[g*32+h] = data[x*N+y];
h++;
}g++; h = 0;
}
system("pause");
for(int d = 32; d<=512; d+=32){
for(int e = 32; e<=512; e+=32){
changeTile = rhs.getTile(d,e);
for(int out = 0; out < 32; out++){
for(int in = 0; in < 32; in++){
val = sameTile[out*32+in] - changeTile[out*32+in];
val = val*val;
sum = sum + val;
}
}
cout << sum << endl;
sum = 0; val = 0;
system("pause");
}
}
getTile(int i, int j) 函数:
double* Matrix::getTile(int i, int j){
double* tile = new double[32*32]; int g = 0; int h = 0;
for(int x=i-32; x<i; x++){
for(int y=j-32; y<j; y++){
tile[g*32+h] = data[x*N+y];
h++;
}
cout << endl;
g++;
}
return tile;
}
我相信错误发生在 changeTile double* 中的内存分配中?
任何帮助将不胜感激。
代码中有一堆问题都与不正确地访问数组元素有关。
在第一个循环中,该行:
sameTile[g*32+h] = data[x*N+y];
至少会下溢数据数组。考虑如果 i=0、j=0 和 N=512,那么您正在尝试在循环的第一遍访问数据 [-16416]。
第二个问题是getTile()方法,你忘记在内部循环结束时将h
重置为0(就像在ssd()方法中所做的那样)。这会导致图块溢出[]
我还会仔细检查该行:
changeTile = rhs.getTile(d, e);
和方法 getTile() 来确保数据 [] 上不会发生数组溢出。
总的来说,如果可能的话,我建议使用适当的 std:: 容器。正确使用它们应该完全消除这种类型的错误。如果您确实需要使用原始指针/数组,那么除了在需要时进行边界检查外,还需要确保对它们的所有索引都尽可能清晰。
相关文章:
- 在C++中检测到堆损坏错误
- AMQP-CPP:TCP 处理程序中的管道损坏错误
- 与强制转换相关的堆损坏错误
- 如何修复C ++中的"堆已损坏"错误?
- 双重释放或损坏错误(找不到错误?
- 对于我的类函数,我得到双重释放或损坏错误
- 为什么我的作业操作员给出了损坏错误
- 为什么 delete[] 会导致堆损坏错误
- 为什么我的visual c++在堆栈损坏的情况下没有触发堆栈损坏错误
- c++运行程序时出现堆已损坏错误
- 范围末尾的C 双免费或损坏错误
- Vector访问中出现内存损坏错误
- C 双免费或损坏错误
- 包含链接列表的链接列表给出了堆的损坏错误:原因
- 在Windows上立即检测到堆损坏错误.如何
- 双重释放或损坏错误
- 使用删除 [] 和新(放置)运算符的可视C++堆损坏错误
- 调试 MS VC++ 2005 中的堆损坏错误
- 堆损坏错误;无法发布 cv::Mat opencv
- 使用auto_ptr时出现内存损坏错误