C++内存泄漏新建并删除

C++ memory leak new and delete

本文关键字:删除 新建 泄漏 内存 C++      更新时间:2023-10-16

我很难找到这个内存泄漏。

我相信这与盆地

有关
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 %lgn", 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 %dn", basin[gene], maxRelabel-1);
        if (relabel[basin[gene]]==0) {
            relabel[basin[gene]] = relabelcnt++;
        }
//        printf("%d %lg %dn", gene, f[gene], relabel[basin[gene]]);
    }
//    printf("%dn", relabelcnt-1);
    delete basin;
    delete relabel;
    return relabelcnt-1;
}

我将保留上述内容以帮助其他人,但是带有向量的新代码现在已 http://codepad.org/KiV85Brw。矢量运行时间比 delete[] 版本慢得多,对于大型输入,它甚至会出现段错误。我做错了什么

如果你使用

operator new[] 来分配一堆字节,那么你必须使用 operator delete[] 来销毁它们:

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

请注意,您正在对 relabel 执行相同的操作。

无论如何,对于此类任务,您应该使用std::vector

std::vector<int> basin(maxBasin), relabel(maxRelabel); // We haz no leaks

new[]后面必须跟delete[],而不仅仅是delete。 您用于释放数组basinrelabel的代码都是错误的。

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

delete[] basin;
delete[] relable;

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

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

   basin = new int [maxBasin];

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

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