我在Solaris上支持一些c代码,至少我觉得它看起来很奇怪:
char new_login[64];
...
strcpy(new_login, (char *)login);
...
free(new_login);
我的理解是,由于变量是本地数组,因此内存来自堆栈而不需要释放,而且由于没有使用malloc / calloc / realloc,因此行为未定义。
这是一个实时系统,所以我认为这是一个浪费周期。我错过了一些明显的东西吗
答案 0 :(得分:17)
你只能释放()从malloc(),calloc()或realloc()函数获得的东西。释放堆栈中的某些内容会产生未定义的行为,您很幸运,这不会导致程序崩溃或更糟。
考虑一个严重的错误,并尽快删除该行。
答案 1 :(得分:7)
没有。这是一个错误。
根据免费(3)....
free()释放指向的内存空间 通过ptr,一定是 之前的电话回复 malloc(),calloc()或realloc()。 否则,或者如果已经免费(ptr) 以前被称为未定义 行为发生。如果ptr为NULL,则为no 操作完成。
因此,您的程序中发生了未定义的行为。
答案 2 :(得分:3)
绝对是一个错误。 free()
必须只用于堆分配内存,除非它被重新定义为完全不同的东西,我怀疑是这样。
答案 3 :(得分:3)
free()肯定是个bug 但是,这里可能还有另一个错误:
strcpy(new_login, (char *)login);
new_login[sizeof(new_login)-1]='\0';
strncpy(new_login, (char *)login, sizeof(new_login)-1 );
答案 4 :(得分:2)
在大多数情况下,你只能释放()在堆上分配的东西。请参阅http://www.opengroup.org/onlinepubs/009695399/functions/free.html。
但是:要做你想要做的事情的一种方法是范围在堆栈上分配的临时变量。如下:
{
char new_login[64];
... /* No later-used variables should be allocated on the stack here */
strcpy(new_login, (char *)login);
}
...
答案 5 :(得分:1)
感谢。很高兴看到我不疯狂。此外,strcpy没有边界检查。我通常使用strncpy来避免这些事情。