微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

2D阵列的动态分配导致内存泄漏

如何解决2D阵列的动态分配导致内存泄漏

我正在实现一个2D矩阵,每行2列,用于存储来自文本文件的数据,我不知道行数。由于我不知道大小,因此我尝试在以下实现中在需要时进行重新分配。

typedef struct {
    int **array;
    size_t used;
    size_t size;
} Array;

void initArray(Array *a,size_t initialSize) {
    a-> array = (int **)malloc(initialSize * sizeof(int *));
    for (int i = 0; i < initialSize; i++)
    {
        a->array[i] = (int *) malloc(2 * sizeof(int));
    }
    a->used = 0;
    a->size = initialSize;
}
void insertArray(Array *a,int firstValue,int secondValue) {

    if (a->used == a->size) {
        a->size *= 2;
        *a->array = (int *) realloc(a->array,a->size * sizeof(int));
        for (int i = a->used; i < a->size; i++)
        {
            a->array[i] = (int *) malloc(2 * sizeof(int *));
        }
    }
    a->array[a->used][0] = firstValue;
    a->array[a->used][1] = secondValue;
    a->used++;
}
void freeArray(Array *a)
{
    for(int i=0; i < a->size; i++)
    {
        free(a->array[i]);
    }
    free(a->array);
    *a->array = NULL;
    a->used = 0;
    a->size = 0;
}
//For easy debugging I added a dummy main
int main(int argc,char *argv[]) {
    Array array;
    initArray(&array,5);
    for(int i=0; i<123; i++)
    {
        insertArray(&array,i,i+1);
    }
    freeArray(&array);
}

因此,我的目标显然是通过在需要时分配1倍的内存来扩展数组。但是我的实现中有一些我找不到的错误

1-)我创建一个数组,并用少于 initialSIze 的数组填充,然后使用函数将其释放。看起来不错,但是如果我使用valgrind进行检查,则会收到以下问题,但它表示没有内存泄漏:

==11887== Invalid write of size 8
==11887==    at 0x109449: freeArray (in /home/qweqwe/CLionProjects/untitled/main)
==11887==    by 0x1095DE: main (in /home/qweqwe/CLionProjects/untitled/main)
==11887==  Address 0x4a4e260 is 0 bytes inside a block of size 40 free'd
==11887==    at 0x483CA3F: free (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==11887==    by 0x109441: freeArray (in /home/qweqwe/CLionProjects/untitled/main)
==11887==    by 0x1095DE: main (in /home/qweqwe/CLionProjects/untitled/main)
==11887==  Block was alloc'd at
==11887==    at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==11887==    by 0x10926D: initArray (in /home/qweqwe/CLionProjects/untitled/main)
==11887==    by 0x109505: main (in /home/qweqwe/CLionProjects/untitled/main)

2-)当我尝试添加一个大于 initialSize 的元素时,第一对元素(array-> array [0] [0],array-> array [0] [1] )替换为一些随机数,(我误将它们释放了吗?)。当我执行valgrind检查时,返回大量错误消息,包括内存泄漏。如果添加更多,则会出现此错误

free(): double free detected in tcache 2
Aborted (core dumped)

那么那里的问题是什么?我以某种方式分配了错误的内存?那我该怎么办呢?

P.S:我的第一个问题是通过从a-> array = NULL中删除*来解决的;在freeArray函数上。请帮我解决第二期问题...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。