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。您用于释放数组的代码basin都是relabel错误的。

于 2012-09-19T20:00:55.107 回答
3

basin和都是relable数组。当您使用运算符在堆上分配数组时new,删除数组的语法与删除单个变量的语法不同。正确的语法是:

delete[] basin;
delete[] relable;

我相信你所写的代码只会删除每个数组的第一个元素。

于 2012-09-19T20:08:48.587 回答
1

由于您正在分配一个数组,因此请使用delete [] basin;. 运算符用于单个对象
deletedelete []是用于多个对象(数组)。

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

对于数组,您应该使用运算符 delete[]。还要检查 relabel.

看起来是一个小的局部变量,你确定要使用动态分配吗?为什么?如果您必须尝试 unique_ptr。

于 2012-09-19T20:02:29.490 回答