3

注:最初は、コードの一部がリークを引き起こしていると思っていましたが、それは正しくないことが判明しました。したがって、以下のコメント。質問を更新しました

考えられる解決策:私はなんとかこれを解決することができました。私がしたことは、すべての初期化を関数の先頭に移動することでした。対応する削除コードに出くわしたときに、それらを一枚の紙にリストし、それらを削り取りました。このように1.削除を見逃しませんでした2.ループ内で何も初期化していないことを確認しました数バイトを除くすべてのリークを排除することができました。更新されたコード:http ://sharetext.org/gPJf 以下にある「前の」コード:


私がエラーに直面している関数はこれです: http ://sharetext.org/3gq0

コメントから、初期化と削除が適切でない可能性があることがわかりました。これは味を担当するコードです

float** CMemAlloc::init_2Dfloat(int rows,int cols)
{
    float **a;
    a=new float*[rows];
    for(int j=0;j<rows;j++)
        a[j]=new float[cols];

    for(int i=0;i<rows;i++)
        for(int j=0;j<cols;j++)
            a[i][j]=0.0;

    return a;

}



void CMemAlloc::del_float(float **a,int rows)
{
    if(a!=NULL)
    {
        for (int i = 0; i <rows; i++) {
            delete[] a[i];
            a[i] = NULL;

        }
        delete[] a;
        a=NULL;
    }
    else
    {
        return;
    }

}

この機能ペアが誤動作していると思われます。

CCoarseFun::window** CCoarseFun::init_2Dwin(int rows,int cols)
{
    window** a;

    a=new window*[rows];
    for(int j=0;j<rows;j++)
        a[j]=new window[cols];

    for(int i=0;i<rows;i++)
    {
        for(int j=0;j<cols;j++)
        {
            a[i][j].line_high=0;
            a[i][j].line_low=0;
            a[i][j].pixel_high=0;
            a[i][j].pixel_low=0;
        }
    }
    return a;
}

void CCoarseFun::del_win(window ** a, int rows)
{
    for(int i=0;i<rows;i++)
    {
        delete [] a[i];
        a[i] = NULL;
    }
    delete[] a;
    a=NULL;
}

ここでエラーが発生する可能性がありますか?

注:トレースステートメントをさまざまなポイントに配置し、「ブロック」のアドレスを出力しています。出力は次のとおりです:http ://sharetext.org/ODSv

私が現在試しているのは、ループ内からすべての初期化を削除することです。

4

1 に答える 1

0

あなたの問題はポインターではなく参照にあると思います。ダブルポインターを使用して2D配列を割り当てており、コードでは次のようになっています。

void CCoarseFun::del_win(window ** a, int rows)

windowポインタによって渡されるのではなく、値によって渡されるポインタです

この問題を解決するには、参照によって渡す必要があります。

void CCoarseFun::del_win(window ** &a, int rows)

そしてここでも..

void CMemAlloc::del_float(float ** &a,int rows)

コードではすべてうまくいきますCCoarseFun::del_win(a,rows);が、そうするとメモリの割り当てが解除されますが、コードにコピーとして渡されるため、無効にはなりません。

于 2013-06-16T08:06:40.647 に答える