Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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+中的堆损坏+; 当我在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

错误出现在以下行:删除[]d[i];
请告诉我这段代码或任何建议是否有任何错误。

正如我在评论中所说,我看不出有任何错误

尝试类似于检查损坏的工具


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:-)