[英]free 2D array allocated using calloc
我正在使用二维数组,并且需要分配它,如下所示:
char ** buf; //global var
void allocate()
{
buf = (char **) malloc (10 * sizeof (char*));
char * data = (char *) calloc (1, 1000);
int i;
for(i=0; i<10; i++)
buf[i] = &(data[i*100]);
}
int main()
{
allocate();
//something goes here
free(buf[0]);
free(buf);
return 0;
}
现在释放 arrays,因为我无法访问main()中的变量“数据”,我无法执行free(data) ,因此我执行free(buf[0]) ,假设我正在释放 1000 个元素的整个数组. 这是正确的方法吗? free(buf[0]) 是否释放整个“数据”数组?
(将 buf 的每个元素 malloc 设置为 buf[i] = malloc (100) 会很方便,但我不能这样做,因为我必须先调用一个大块)。
提前致谢。
这段代码是正确的。 buf[0]
的值是&(data[0])
,根据定义是data
。 这将释放所有已分配的 memory。
请注意,如果您真的只想释放一个缓冲区,您可以设置:
offset = 10*sizeof(char*);
buf = calloc(10*100+offset);
并在循环中执行:
buf[i] = buf + offset + i*100;
这有点不寻常,但它是正确的。 你做了两次分配; 你做了两个免费的。 然后释放已分配的指针。 一切都应该是干净的。
你在你的程序上运行了valgrind
吗?
Valgrind 同意你的观点。 这是正确的,因为 buf[0] 持有指向 calloc'd memory 块的 HEAD 的指针。
valgrind ./temp
==15404== Memcheck, a memory error detector
==15404== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==15404== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==15404== Command: ./temp
==15404==
==15404==
==15404== HEAP SUMMARY:
==15404== in use at exit: 0 bytes in 0 blocks
==15404== total heap usage: 2 allocs, 2 frees, 1,040 bytes allocated
==15404==
==15404== All heap blocks were freed -- no leaks are possible
==15404==
==15404== For counts of detected and suppressed errors, rerun with: -v
==15404== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 12 from 7)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.