我正在努力在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);
这是对的吗?任何反馈都表示赞赏。
答案 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-int 。根据您的系统,每个指针将为4-bytes
或8-bytes
。您正在为指针变量本身分配空间,但每个指针当前都没有指向。
分配OriginalPixels[0]
时,您正在分配一块内存来保存ro * co
个整数。实际上,您要为所有ro
行的co
列分配存储空间。 (注意:您分配的所有其他指针都未使用且不必要)
要释放内存,您必须在已分配的逆序中取消分配。意思是,你必须释放持有整数的内存块,然后释放指针。 e.g。
free (OriginalPixels[0]);
free (OriginalPixels);
将ro
指针分配到co
整体
注意:没有理由在此案例中分配OriginalPixels
和OriginalPixels[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)