有人可以告诉我区别:
int *p;
p=(int*)malloc(10*sizeof(int));
free(p);
或
int *p;
p=(int*)malloc(10*sizeof(int));
p=NULL;
答案 0 :(得分:39)
free
将释放p
指向的内存 - 只需将其分配给NULL
就不会(因此会有内存泄漏)。
值得一提的是,最好在调用NULL
之后将指针指向free
,因为这样可以防止您意外尝试访问释放的内存(这仍然是可能的) ,但绝对不应该这样做。)
答案 1 :(得分:9)
C中没有垃圾收集,所以如果你没有显式释放一块内存,它就永远不会被释放,即使没有引用它。也许你来自垃圾收集语言的背景,因此可能很难改变你的想法,但记住“手动”释放像C这样的低级语言中的所有资源总是很重要。
希望这会有所帮助 干杯
答案 2 :(得分:7)
p是指针(对于在内存中动态分配的块[“在堆上”]) 这意味着p是一个变量,它在特定块的内存中包含地址(或某个特定大小,在示例中是一个足以容纳10个整数的块)。
free(p);
指示内存管理逻辑(C运行时),p指向的块先前占用的内存可以重用。
p = NULL;
将p的值设置为NULL(以前包含的地址丢失)但是它指向的内存块仍然被认为正在使用中。
可能存在一些混淆,因为在诸如Java,C#,Python等语言中仅仅将变量分配给NULL(或者将该变量分配给另一个地址),将自动释放底层内存(假设没有其他对该地址的引用)存在于其他实时变量中。)
在C或C ++中不是这种情况,导致如下错误:
free(p);
// possibly some some code etc.
// later:
p[6] = 'a'; // <<--- Ouch we're modifying whatever new variable is there !!!
或
// didn't call free(p)
p = NULL;
// now the memory allocated for p is held in memory even though it
// is not going to be used (assuming no copies of p or of pointers to part
// of that block were made.
后一种情况只是浪费资源,前者可能导致很难发现错误。
这就是一个典型的C语言的原因:
free(p);
p = NULL;
答案 3 :(得分:2)
不调用free并直接分配给NULL将导致内存泄漏,正如其他人所解释的那样。您可以参考此link以获取有关内存泄漏和其他内存相关问题的详细信息。
答案 4 :(得分:2)
更好的方法是首先释放内存,然后将其设置为NULL:
free(p);
p = NULL;
答案 5 :(得分:1)
释放已分配的内存会释放它并允许在其他地方使用该内存,同时保留指向内存分配位置的指针。
将指向已分配内存的指针设置为NULL不会取消分配它。
如果您正在使用使用基于堆的malloc的实现,请调试分配,使用和释放内存的内容,并对分配,使用和将指向内存的指针设置为NULL的内容执行相同操作。
内存管理依赖于实现(参见http://en.wikipedia.org/wiki/Malloc#Implementations)。
答案 6 :(得分:1)
1
int *p;
p= (int * ) malloc(10*sizeof(int));
free(p);
将内存释放回堆中。但指针仍然指向释放的内存位置。因此,如果进一步使用,将导致内存损坏。
因此,正确的做法是将指针显式重置为NULL,以避免进一步使用该指针。
不建议在C
中输入转换指针2
int *p;
p=(int * )malloc(10*sizeof(int));
p=NULL;
这会导致内存泄漏:因为此处未释放分配的内存。你只需将指针重置为NULL。
答案 7 :(得分:1)
p=NULL
不释放内存。如果您不再需要使用p
指向的内存,则应使用free()
否则会出现内存泄漏。您还应在调用p=NULL
后设置free()
,以避免将来再次错误地访问该内存。