使用操作符删除动态但仍然存在的内存泄漏

using operator delete an dynamic but still memory leak

本文关键字:存在 内存 泄漏 操作符 删除 动态      更新时间:2023-10-16

我编写了一个代码来计算地图中一个区域的平均温度。

开始时,initial()将被调用,然后loadtempdata(),然后averagetemp(),最后cleanup()

我已经使用一个全局指针指向一个堆动态数组的函数,以便它可以在其他函数中使用。最后,我使用delete[] table来回收内存,但结果表明我仍然有内存泄漏,我已经发现了很长时间,找不到原因。

为什么还有内存泄漏?

谢谢。

#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;
    }
}

有了你的前提条件,我能想到的内存泄漏的唯一原因是:多次调用LoadTempData。您应该在LoadTempData函数的开头添加以下代码:

if (table != 0)
    Cleanup();

否则两次调用LoadTempData将导致第一个数据指针被简单地覆盖,而不是实际地释放它。

是否有机会在Cleanup()被调用之前,您或判断系统调用LoadTempData不止一次?