0

マップ内のエリア温度の平均を計算するコードを作成しました。

最初initial()に が呼び出され、次にloadtempdata()thenが呼び出されaveragetemp()、finallyが呼び出されますcleanup()

そして、関数内のヒープ動的配列を指すグローバルポインターを使用して、他の関数で使用できるようにしました。最後に、 を使用しdelete[] tableてメモリをリサイクルしましたが、結果はまだメモリ リークがあることを示しており、長い間それを発見しており、理由を見つけることができません。

なぜまだメモリリークがあるのですか?

事前にThx。

#include<iostream>
namespace TEST
{
    double *table = 0;
    const double *mtx = 0;
    int n = 0, m = 0;

    void LoadTempData(const double* matrix_row_major, int M, int N){
        table = new double [(M + 1) * (N + 1)];
        mtx = matrix_row_major;
        m = M;
        n = N;
        for(int i = 1; i < M + 1; i ++){
            for(int j = 1; j < N + 1; j ++){
                table[j + i * (N + 1)] = matrix_row_major[(j - 1) + (i - 1) * N]
                + table[j - 1 + i * (N + 1)]
                + table[j + (i - 1) * (N + 1)]
                - table[j - 1 + (i - 1) * (N + 1)];
            }
        }
    }
    double RegionAvgTemp(int y1, int x1, int y2, int x2){
        if(y1 == y2){
        return (table[x2 + 1 + (y2 + 1) * (n + 1)]
        - table[x2 + 1 + (y2 - 1 + 1) * (n + 1)]
        - table[x1 - 1 + 1 + (y1 + 1) * (n + 1)]
        + table[x1 - 1 + 1 + (y1 - 1 + 1) * (n + 1)]) / (x2 - x1 + 1);
        }
        else if(x1 == x2){
        return (table[x2 + 1 + (y2 + 1) * (n + 1)]
        - table[x1 + 1 + (y1 - 1 + 1) * (n + 1)]
        - table[x2 - 1 + 1 + (y2 + 1) * (n + 1)]
        + table[x1 - 1 + 1 + (y1 - 1 + 1) * (n + 1)]) / (y2 - y1 + 1);
        }
        else if ((y1 == y2) && (x1 == x2)){
            return mtx[x1 + y1 * n];
        }
        else{
        return (table[x2 + 1 + (y2 + 1) * (n + 1)]
        + table[x1 - 1 + 1 + (y1 - 1 + 1) * (n + 1)]
        - table[x2 + 1 + (y1 - 1 + 1) * (n + 1)]
        - table[x1 - 1 + 1 + (y2 + 1) * (n + 1)]) / ((y2 - y1 + 1) * (x2 - x1 + 1));
        }
        return 0;
    }


    void Init()
    {

    }

    void Cleanup()
    {
        delete[] table;
    }

}
4

2 に答える 2

2

あなたの前提条件で、私が考えることができるメモリリークの唯一の原因は次のとおりです:への複数の呼び出しLoadTempDataLoadTempData関数の先頭に次のコードを追加する必要があります。

if (table != 0)
    Cleanup();

それ以外の場合、を2回呼び出すとLoadTempData、最初のデータポインターが、実際に割り当てを解除せずに単純に上書きされます。

于 2013-03-18T20:44:24.977 に答える
2

Cleanup() が呼び出される前に、あなたまたは審査員システムが LoadTempData を複数回呼び出す可能性はありますか?

于 2013-03-18T20:41:13.200 に答える