C语言 如何释放指向指针的指针



我正在努力用 C 语言解除分配我的内存。该程序运行良好,但是我当前的免费语句报告在通过Dr.Memory运行时内存泄漏。这些语句适用于知道列 (co) 和行 (ro) 数量的多维数组。

int **OriginalPixels;
OriginalPixels=(int **)malloc(sizeof(int *)*ro); //utilizing double         pointer
OriginalPixels[0]=(int *)malloc(sizeof(int)*co*ro);// Connects to beginning.

我目前正在释放这个声明

free(*OriginalPixels);

这是对的吗?任何反馈不胜感激。

No.每个malloc都需要一个匹配的free。您只有一个free。但两个malloc S。

 free(OriginalPixels[0]);   
 free(OriginalPixels);

当然,如果您的数组有多个行,您将需要更多两行。

int **OriginalPixels;
OriginalPixels=(int **)malloc(sizeof(int *)*ro); //utilizing double pointer
OriginalPixels[0]=(int *)malloc(sizeof(int)*co*ro);// Connects to beginning.

分配OriginalPixels时,ro分配指向 type-int 的指针。根据您的系统,每个指针都将是 eith 4-bytes8-bytes 。您正在为指针变量本身分配空间,但每个指针当前都不指向任何位置。

当你分配OriginalPixels[0]时,你正在分配一个内存块来保存ro * co整数。实质上,您正在为co列的所有ro行分配存储。(注意:您分配的所有其他指针都是未使用且不必要的)

要释放内存,必须按分配的相反顺序解除分配。这意味着,您必须释放保存整数的内存块,然后释放指针。例如

free (OriginalPixels[0]);
free (OriginalPixels);

ro指针分配给co整数

注意:在这种情况下,几乎没有理由同时分配OriginalPixelsOriginalPixels[0](即分配ro数量的co整数数组,然后将块的起始地址仅分配给OriginalPixels[0])。如果 co 是一个常量,您可以使用指向数组co -int指针一次分配所有内容,例如

int (*OriginalPixels)[co];
OriginalPixels = malloc (sizeof *OriginalPixels * ro);

在这种情况下,您可以像使用指针到点到类型一样索引每个整数,但只需要 1 free,例如 free (OriginalPixels);

注意2:,在分配数字数组时考虑calloc,以从提供的初始化中受益)

下面是分配指向 co-int 数组的指针的简短示例:

#include <stdio.h>
#include <stdlib.h>
enum { ro = 2, co = 5 };
int main (void) {
    int (*a)[co] = {NULL}, i, j;    /* array a[ro][co]    */
    a = malloc (sizeof *a * ro);    /* validation omitted */
    for (i = 0; i < ro; i++)
        for (j = 0; j < co; j++)
            scanf ("%d", &a[i][j]); /* return chk omitted */
    for (i = 0; i < ro; i++) {
        for (j = 0; j < co; j++)
            printf (" %d", a[i][j]);
        putchar ('n');
    }
    putchar ('n');
    free (a);
    return 0;
}

内存错误检查

$ echo "1 2 3 4 5 6 7 8 9 1" | valgrind ./bin/allocnarray
==11731== Memcheck, a memory error detector
==11731== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==11731== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==11731== Command: ./bin/allocnarray
==11731==
 1 2 3 4 5
 6 7 8 9 1
==11731==
==11731== HEAP SUMMARY:
==11731==     in use at exit: 0 bytes in 0 blocks
==11731==   total heap usage: 1 allocs, 1 frees, 40 bytes allocated
==11731==
==11731== All heap blocks were freed -- no leaks are possible
==11731==
==11731== For counts of detected and suppressed errors, rerun with: -v
==11731== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 1 from 1)

相关内容

  • 没有找到相关文章

最新更新