如何释放指针指针?

时间:2016-03-13 20:53:44

标签: c memory malloc

我正在努力在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);

这是对的吗?任何反馈都表示赞赏。

2 个答案:

答案 0 :(得分:4)

没有。每个malloc都需要匹配free。您只有一个free。但是两个malloc s。

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

当然,如果您的数组有多行,那么您需要更多行。

答案 1 :(得分:0)

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

分配OriginalPixels时,您正在分配ro pointers-to-type-in​​t 。根据您的系统,每个指针将为4-bytes8-bytes。您正在为指针变量本身分配空间,但每个指针当前都没有指向。

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

要释放内存,您必须在已分配的逆序中取消分配。意思是,你必须释放持有整数的内存块,然后释放指针。 e.g。

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

ro指针分配到co整体

注意:没有理由在案例中分配OriginalPixelsOriginalPixels[0](即分配ro个数组co ints ,然后将块的起始地址分配给OriginalPixels[0])。如果co是常量,则可以使用指针到数组 - co -int 一次性分配所有内容,例如< / p>

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

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

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

以下是分配指向数组的指针的简短示例:

#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)