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