有人可以告诉我之间的区别:
int *p;
p=(int*)malloc(10*sizeof(int));
free(p);
Run Code Online (Sandbox Code Playgroud)
要么
int *p;
p=(int*)malloc(10*sizeof(int));
p=NULL;
Run Code Online (Sandbox Code Playgroud)
dan*_*ben 40
free将释放p指向的内存- 简单地指定它NULL不会(因此你将有内存泄漏).
值得一提的是,最好将指针分配给NULL调用之后free,因为这样可以防止您意外地尝试访问释放的内存(这仍然是可能的,但绝对不应该这样做).
ric*_*son 10
C中没有垃圾收集,所以如果你没有显式释放一块内存,它就永远不会被释放,即使它没有引用它.也许你来自垃圾收集语言的背景,所以可能很难改变你的思维方式,但记住"手动"释放像C这样的低级语言中的所有资源总是很重要的.
希望这有助于干杯
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 !!!
Run Code Online (Sandbox Code Playgroud)
要么
// 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.
Run Code Online (Sandbox Code Playgroud)
后一种情况只是浪费资源,前者可能导致难以发现的错误.
这就是为什么典型的C语言是:
free(p);
p = NULL;
Run Code Online (Sandbox Code Playgroud)