我正在努力用 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-bytes
或 8-bytes
。您正在为指针变量本身分配空间,但每个指针当前都不指向任何位置。
当你分配OriginalPixels[0]
时,你正在分配一个内存块来保存ro * co
整数。实质上,您正在为co
列的所有ro
行分配存储。(注意:您分配的所有其他指针都是未使用且不必要的)
要释放内存,必须按分配的相反顺序解除分配。这意味着,您必须释放保存整数的内存块,然后释放指针。例如
free (OriginalPixels[0]);
free (OriginalPixels);
将ro
指针分配给co
整数
注意:在这种情况下,几乎没有理由同时分配OriginalPixels
和OriginalPixels[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)