据我从其他SO问题的答案中可以看出,我不需要像下面这样释放固定长度的数组:
unsigned char buffer[16];
但一般来说,每当调用malloc
、
我的问题是:在以下情况下,我是否需要调用free
:
unsigned char buffer[16];
memcpy(buffer, source, 16);
...
free(buffer); // needed?
更准确地说:是使用堆还是堆栈的决定是基于变量的声明或初始化?
你只free()
由 malloc()
/calloc()
/realloc()
返回的指针,传递任何未由这些函数之一返回的指针都是未定义的行为。
在分配数组的情况下,例如
unsigned char buffer[16];
在函数内部,数组将在超出范围时自动释放,即当函数返回时。
事实上,该数组仅在声明它的范围内有效
if (condition != 0)
{
unsigned char buffer[16];
}
/* here it was already deallocated */
上面的例子是一个很好的例子,它证明了使用 GCC 启用-Wshadow
是合理的。
如果堆栈上有数组,则不需要释放它;当堆栈帧弹出时,它将自动回收。
如果堆上有一个数组(使用 malloc 或类似函数分配),则需要显式释放。否则会出现内存泄漏。
不,您已在堆栈上分配了对象,因此不需要空闲。如果使用 malloc,则将在堆上分配内存,然后必须释放它。