повреждение кучи в с ++ - PullRequest
       35

повреждение кучи в с ++

2 голосов
/ 24 февраля 2011

Я получаю сообщение об ошибке во время выполнения, когда я запускаю свой код в Visual C ++ 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;
}

ошибка появляется в строке: delete [] d [i]; пожалуйста, скажите мне, если что-то не так с этим фрагментом кода или любым советом.

Ответы [ 4 ]

1 голос
/ 24 февраля 2011

Помимо того, что вы не должны писать C ++ таким образом (это просто C с новым вместо malloc), я не вижу никаких ошибок памяти, но не знаю, что такое mat и как он был распределен.

1 голос
/ 24 февраля 2011

Я изменил ваше дискретное косинусное преобразование и код бабочки, чтобы соответствовать моему компилятору C (не C ++).Я вставил фиктивные функции и константы для тех, которых у меня нет.Это работает (я проверил его до len = 1000) без повреждения памяти.Причина, по которой моя версия работает , может быть new float*[len], которую можно переписать на malloc(len*sizeof(float*)), чтобы попробовать, если это было проблемой.попробуй сам) Кстати, мне интересно, что ты new в dct2 (), но delete в doublecpy ().Это мой адаптированный код:

    #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();
    }
0 голосов
/ 24 февраля 2011

Я начал преобразовывать все массивы в 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(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];
        }
    }
}

Хотя это очень странно.Я ожидал получить «индекс массива вне границ» или «ошибку сегментации» при запуске неверного кода в строке: mat [i] [j] = arr [i] [j];

В любом случае спасибоВы все за вашу помощь.

0 голосов
/ 24 февраля 2011

Как сказано в моем комментарии, я не вижу ничего плохого ...

Попробуйте проверить такие инструменты, как Дума ...

my2c

...