0

このメモリリークを見つけるのに苦労しています。

盆地と関係があると思います

int numbasinsx(int size, double *f)
{
    int maxBasin, maxRelabel, bcnt;
    unsigned int newgene;
    int *basin, *relabel;
    int relabelcnt;

    //
    // find the basins
    //
    maxBasin = 1<<size;
    basin = new int [maxBasin];
    for (int gene=0; gene<maxBasin; gene++) basin[gene] = 0;

    bool change = true;
    bcnt = 0;
    while (change) {
        change = false;

        for (int gene=0; gene<maxBasin; gene++) {

            bool dominated = false;
            for (int i=0; i<size; i++) {               // for all neighbors
                newgene = gene ^ (1<<i);               // newgene is a neighbor 1 bit away

                if (f[newgene] > f[gene]) dominated = true;  // if neighbor is better mark it

                if (basin[newgene]!=0) {                                        // something to copy
                    if (f[newgene] > f[gene]) {                                // gene is dominated
                        if (basin[gene]==0 || basin[gene]<basin[newgene]) {    // if not labeled or not lowest number
                            basin[gene] = basin[newgene];                      // then label or relabel
                            change = true;
                        }
                    }
                    else if (f[newgene] == f[gene]) {
                        if (basin[gene]<basin[newgene]) {
                            basin[gene] = basin[newgene];
                            change = true;
                        }
                    }
                }
            }

            if (! dominated && basin[gene]==0) {
//                printf("max: %d %lg\n", gene, f[gene]);
                basin[gene] = ++bcnt;
                change = true;
            }
        }
    }


    //
    // relabel the basins
    //
    maxRelabel = maxBasin/2+1;
    relabel = new int [maxRelabel];
    for (int gene=0; gene<maxRelabel; gene++) relabel[gene] = 0;

    relabelcnt = 1;
    for (int gene=0; gene<maxBasin; gene++) {
        if (basin[gene]>=maxRelabel) printf("ERROR: trying to index %d into relabel array with max index of %d\n", basin[gene], maxRelabel-1);

        if (relabel[basin[gene]]==0) {
            relabel[basin[gene]] = relabelcnt++;
        }
//        printf("%d %lg %d\n", gene, f[gene], relabel[basin[gene]]);
    }
//    printf("%d\n", relabelcnt-1);

    delete basin;
    delete relabel;

    return relabelcnt-1;
}

他の人を助けるために上記を残しておきますが、ベクトルを含む新しいコードはhttp://codepad.org/KiV85Brwにあります。ベクトルの実行時間は、delete[] バージョンよりもはるかに遅く、大きな入力に対してセグメンテーション フォールトさえ発生します。私は何か間違ったことをしています

4

5 に答える 5

9

operator new[]大量のバイトを割り当てるために使用する場合は、それらを破棄するために使用する必要があります:operator delete[]

basin = new int [maxBasin];
//.....
delete[] basin;

で同じことをしていることに注意してくださいrelabel

とにかく、この種のタスクには、次を使用する必要がありますstd::vector

std::vector<int> basin(maxBasin), relabel(maxRelabel); // We haz no leaks
于 2012-09-19T20:01:38.663 に答える
4

new[]delete[]だけでなく、が続く必要がありますdelete。配列を解放するためのコードbasinrelabelすべて間違っています。

于 2012-09-19T20:00:55.107 に答える
3

basinとは両方ともrelable配列です。演算子を使用してヒープに配列を割り当てる場合、配列newを削除するための構文は、単一の変数を削除するための構文とは異なります。正しい構文は次のとおりです。

delete[] basin;
delete[] relable;

あなたが書いたコードは、各配列の最初の要素のみを削除すると思います。

于 2012-09-19T20:08:48.587 に答える
1

配列を割り当てているため、 を使用しますdelete [] basin;。演算子は単一オブジェクト用です
deleteこれdelete []は、複数のオブジェクト (配列) 用です。

于 2012-09-19T20:01:31.237 に答える
1
   basin = new int [maxBasin];

配列では、演算子 delete[] を使用する必要があります。も確認してください relabel

小さなローカル変数のようです。動的割り当てを使用してもよろしいですか? なんで?必要な場合は、unique_ptr を試してください。

于 2012-09-19T20:02:29.490 に答える