2012-05-16 40 views
1

假设以下情形:char *为char [] - 是否有必要?

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和自由,以避免内存泄漏?

只是我在想的一个理论问题。

+1

'while(!notTheEnd)' - “while not not end”?看起来像一个错误。 – Jesper

+0

哈哈你是对的。只是一个快速虚构的场景;)没有真正的代码。 – Stefan

+0

ptr_to_str只是一个不会忘记的指针,你必须找出实际数据来自哪里,在这种情况下,它来自你的本地(读取:堆栈)变量'str'。由于它是在堆栈中分配的,因此不需要释放/删除它。 – fileoffset

回答

7

你只需要free()你有什么malloc() ed。因此:

又见了free()手册页:

的free()函数释放内存空间由PTR,必须已返回由以前调用的malloc()指出,释放calloc ()或realloc()。否则,或者如果释放(ptr)之前已被调用,则会发生未定义的行为。如果ptr为NULL,则不执行任何操作。

注意,其它功能可以使用malloc()或类似内部因此也要求返回的缓冲区(例如strdup)被free'd。不需要设置指针NULL的指针。然而,它增加了一些便利,因为对该指针的后续调用free()不会将应用程序暴露给未定义的行为。而且,如果一致地完成,您可以检查指针是否确实指向一个对象。

+0

好的,谢谢。我想到了这样的事情,但在某种程度上,我有点不确定O :-) – Stefan

4

您从未拨打malloc(),因此您无需致电free()

你有什么是一个指向堆栈上的字符数组的指针,它不需要显式的重新分配。

3

不,只要你不分配内存(在堆上),你不需要释放它。有一些例外(如strdup),但这是一般规则。

1

​​将在当前堆栈中分配1024个字节。当函数返回时,这个空间将自动“弹出”。所以你不需要明确地释放这个内存。