我正在支持一些在Solaris系统上的C代码,并且我看到了一些奇怪的东西,至少我认为是这样:
char new_login[64];
...
strcpy(new_login, (char *)login);
...
free(new_login);
我的理解是,由于变量是一个本地数组,内存来自堆栈,不需要释放,而且由于没有使用malloc/calloc/realloc,行为是未定义的。
这是一个实时系统,所以我认为这是浪费时间。我是否错过了什么明显的东西?
我正在支持一些在Solaris系统上的C代码,并且我看到了一些奇怪的东西,至少我认为是这样:
char new_login[64];
...
strcpy(new_login, (char *)login);
...
free(new_login);
我的理解是,由于变量是一个本地数组,内存来自堆栈,不需要释放,而且由于没有使用malloc/calloc/realloc,行为是未定义的。
这是一个实时系统,所以我认为这是浪费时间。我是否错过了什么明显的东西?
只有从malloc()、calloc()或realloc()函数获取的内存才能使用free()函数释放。在堆栈上释放内存会导致未定义的行为,你很幸运这没有导致程序崩溃或更糟糕的后果。
把这种操作视为严重的错误,并尽快删除该行代码。
free
检查指针的范围,并且当它来自堆之外的区域时不执行任何操作。在我看来这不是一个好主意,但谁知道实现者的想法(在我以前的嵌入式程序员生涯中,我甚至在我们的某个采集控制器上实现了这种行为)。 - Patrick Schlüterfree()
实现中,那么您可能需要采取更多措施来处理它,而不是“默默忽略”。 - caf不,这是一个bug。
根据free(3)的说明...
free()函数释放ptr指向的内存空间,该指针必须是之前通过malloc()、calloc()或realloc()返回的。否则,如果之前已经调用了free(ptr),或者ptr为NULL,则会出现未定义的行为。
因此,你的程序中出现了未定义的行为。
{
char new_login[64];
... /* No later-used variables should be allocated on the stack here */
strcpy(new_login, (char *)login);
}
...
The free() is definitely a bug.
However, it's possible there's another bug here:
strcpy(new_login, (char *)login);
new_login[sizeof(new_login)-1]='\0';
strncpy(new_login, (char *)login, sizeof(new_login)-1 );
这绝对是一个bug。除非free()
重新定义以执行完全不同的操作(我怀疑这种情况),否则它必须仅用于堆分配的内存。
free()
了。 - kennytmnew_login = 0
不应该编译。 - Steve Jessop