假设以下情形:
while(!notTheEnd) {
char str[1024];
char* ptr_to_str;
/* some strcat, strcpy on str */
ptr_to_str = str;
chmod(ptr_to_str, 0777);
}
我是否必须设置char * ptr_to_str = NULL并释放它以避免内存泄漏?
只是我想到的一个理论问题。
答案 0 :(得分:7)
您只需要free()
所拥有的内容malloc()
。因此:不。
另请参阅free()的联机帮助页:
free()函数释放ptr指向的内存空间,该内存空间必须由之前调用malloc(),calloc()或realloc()返回。否则,或者如果之前已经调用了free(ptr),则会发生未定义的行为。如果ptr为NULL,则不执行任何操作。
请注意,其他函数可能在内部使用malloc()
或类似,因此也要求返回的缓冲区是免费的(例如strdup)。
根本不需要将指针设置为NULL
。然而,它增加了一些便利性,因为对此指针的free()
的后续调用不会将应用程序暴露给未定义的行为。并且,如果一致地完成,您可以检查指针是否确实指向对象。
答案 1 :(得分:4)
您从未致电malloc()
,因此您无需致电free()
。
你所拥有的是指向堆栈上字符数组的指针,它不需要显式释放。
答案 2 :(得分:3)
不,只要你不分配内存(在堆上),你就不需要释放它。有一些例外(例如strdup
),但这是一般规则。
答案 3 :(得分:1)
char str[1024]
将在当前堆栈中分配1024个字节。当函数返回时,此空间将自动“弹出”。因此,您无需明确释放此内存。