c+中的堆损坏+; 当我在VisualC++ 2010中运行我的代码时,运行时会出错。 void dct2(){ float** G = new float*[len]; for(int u = 0; u < len; u++){ G[u] = new float[len]; for(int v = 0; v < len; v++){ G[u][v] = 0; for(int x = 0; x < len; x++){ for(int y = 0; y < len; y++){ G[u][v] += a(u) * a(v) * (float)mat[x][y] * cos((PI / 8) * u * (x + 0.5)) * cos((PI / 8) * v * (y + 0.5)); } } } } doublecpy(G); } void doublecpy(float** d){ for(int i = 0; i < len; i++){ for(int j = 0; j < len; j++){ if(d[i][j] >= 0) mat[i][j] = (int)(d[i][j] + 0.5); else mat[i][j] = (int)(d[i][j] - 0.5); } } for(int i = 0; i < len; i++) delete[] d[i]; delete[] d; } void dct2(){ 浮动**G=新浮动*[len]; 对于(int u=0;u
错误出现在以下行:删除[]d[i];c+中的堆损坏+; 当我在VisualC++ 2010中运行我的代码时,运行时会出错。 void dct2(){ float** G = new float*[len]; for(int u = 0; u < len; u++){ G[u] = new float[len]; for(int v = 0; v < len; v++){ G[u][v] = 0; for(int x = 0; x < len; x++){ for(int y = 0; y < len; y++){ G[u][v] += a(u) * a(v) * (float)mat[x][y] * cos((PI / 8) * u * (x + 0.5)) * cos((PI / 8) * v * (y + 0.5)); } } } } doublecpy(G); } void doublecpy(float** d){ for(int i = 0; i < len; i++){ for(int j = 0; j < len; j++){ if(d[i][j] >= 0) mat[i][j] = (int)(d[i][j] + 0.5); else mat[i][j] = (int)(d[i][j] - 0.5); } } for(int i = 0; i < len; i++) delete[] d[i]; delete[] d; } void dct2(){ 浮动**G=新浮动*[len]; 对于(int u=0;u,c++,heap,corruption,C++,Heap,Corruption,错误出现在以下行:删除[]d[i]; 请告诉我这段代码或任何建议是否有任何错误。正如我在评论中所说,我看不出有任何错误 尝试类似于检查损坏的工具 My2C< P>除了你不应该这样写C++(这是C,用新代替MALLC),我看不到任何内存错误,但不知道什么是MAT,它是如何分配的。 < P>我修改了你的离散余弦变换和蝶形代码,以适应我的C编译器(不是C++)。我为那些我没有的插入了伪函数和常量。它在不损坏内存的情况下工作(我测试了len=1000)。我的版本工作的原因可能是newfloat*[le
请告诉我这段代码或任何建议是否有任何错误。正如我在评论中所说,我看不出有任何错误 尝试类似于检查损坏的工具
My2C
< P>除了你不应该这样写C++(这是C,用新代替MALLC),我看不到任何内存错误,但不知道什么是MAT,它是如何分配的。 < P>我修改了你的离散余弦变换和蝶形代码,以适应我的C编译器(不是C++)。我为那些我没有的插入了伪函数和常量。它在不损坏内存的情况下工作(我测试了len=1000)。我的版本工作的原因可能是newfloat*[len]
,您可以将其重写到malloc(len*sizeof(float*))
,以尝试解决问题
(我手边没有一个c++编译器可以自己尝试)
顺便说一句,我发现有趣的是,您在dct2()中创建了new
,但在doublecpy()中删除了delete
无论如何。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#define len 1000
#define PI 3.14
float mat[len][len];
float a(int u) {
return 1.0;
}
void doublecpy(float** d){
int i;
for(i = 0; i < len; i++){
int j;
for(j = 0; j < len; j++){
if(d[i][j] >= 0)
mat[i][j] = (int)(d[i][j] + 0.5);
else
mat[i][j] = (int)(d[i][j] - 0.5);
}
}
for(i = 0; i < len; i++)
free(d[i]);
free(d);
}
void dct2(){
float** G = malloc(len*sizeof(float*));//new float* [len];
int u;
for(u = 0; u < len; u++){
G[u] = malloc(len*sizeof(float));
int v;
for(v = 0; v < len; v++){
G[u][v] = 0;
int x;
for(x = 0; x < len; x++){
int y;
for(y = 0; y < len; y++){
G[u][v] += a(u) * a(v) * (float)mat[x][y] * cos((PI / 8) * u * (x + 0.5)) * cos((PI / 8) * v * (y + 0.5));
}
}
}
}
doublecpy(G);
}
int main()
{
dct2();
getch();
}
#包括
#包括
#定义len 1000
#定义PI 3.14
浮垫[len][len];
浮点数a(整数u){
返回1.0;
}
无效双CPY(浮动**d){
int i;
对于(i=0;i=0)
mat[i][j]=(int)(d[i][j]+0.5);
其他的
mat[i][j]=(int)(d[i][j]-0.5);
}
}
对于(i=0;i
我开始将所有数组转换为std::vector,中途我运行了代码。这并没有解决我的问题,但我找到了错误的原因。正是在这个功能中:
void cpy(int** arr, int x, int y){
for(int i = x; i < x + len; i++){
for(int j = y; j < y + len; j++){
mat[i][j] = arr[i][j];
}
}
}
void cpy(整数**arr,整数x,整数y){
对于(int i=x;i
错误非常明显,我纠正了它:
void cpy(int** arr, int x, int y){
for(int i = 0; i < len; i++){
for(int j = 0; j < len; j++){
mat[i][j] = arr[i + x][j + y];
}
}
}
void cpy(整数**arr,整数x,整数y){
对于(int i=0;i
虽然这很奇怪。我希望在行中运行错误代码时收到“数组索引越界”或“分段错误”:mat[I][j]=arr[I][j]
无论如何,谢谢大家的帮助。看起来还可以。len真的是常数吗?它的修改是我发现的唯一明显的事情,除了更复杂的堆损坏…您确定
mat
具有正确的大小和分配吗?你没有写在它的范围之外吗?建议(抱歉,没有直接的解决方案):1)尝试在与新的相同的范围内删除(现在,doublecpy()有严重的副作用)。2) 使用std::vectorholly垃圾避免新建/删除。这段代码看起来很糟糕。您应该将其标记为C:array、大规模显式堆分配、强制类型转换。。。我不同意。如果你打算用C语言编写,那么就这样做,并使用malloc和free.BTW,如果你真的想使用DCT函数,函数a()就不是这样定义的。我猜PI不完全是3.14:-)