假设以下情形: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和自由,以避免内存泄漏?
只是我在想的一个理论问题。
假设以下情形: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和自由,以避免内存泄漏?
只是我在想的一个理论问题。
你只需要free()
你有什么malloc()
ed。因此:
又见了free()手册页:
的free()函数释放内存空间由PTR,必须已返回由以前调用的malloc()指出,释放calloc ()或realloc()。否则,或者如果释放(ptr)之前已被调用,则会发生未定义的行为。如果ptr为NULL,则不执行任何操作。
注意,其它功能可以使用malloc()
或类似内部因此也要求返回的缓冲区(例如strdup)被free'd。不需要设置指针NULL
的指针。然而,它增加了一些便利,因为对该指针的后续调用free()
不会将应用程序暴露给未定义的行为。而且,如果一致地完成,您可以检查指针是否确实指向一个对象。
好的,谢谢。我想到了这样的事情,但在某种程度上,我有点不确定O :-) – Stefan
您从未拨打malloc()
,因此您无需致电free()
。
你有什么是一个指向堆栈上的字符数组的指针,它不需要显式的重新分配。
不,只要你不分配内存(在堆上),你不需要释放它。有一些例外(如strdup
),但这是一般规则。
将在当前堆栈中分配1024个字节。当函数返回时,这个空间将自动“弹出”。所以你不需要明确地释放这个内存。
'while(!notTheEnd)' - “while not not end”?看起来像一个错误。 – Jesper
哈哈你是对的。只是一个快速虚构的场景;)没有真正的代码。 – Stefan
ptr_to_str只是一个不会忘记的指针,你必须找出实际数据来自哪里,在这种情况下,它来自你的本地(读取:堆栈)变量'str'。由于它是在堆栈中分配的,因此不需要释放/删除它。 – fileoffset