Answers
变量所占 内存的回收方式取决于该变量的存储类型 (storage class),对于你讲的结构体而言:
- 如果是在函数内定义的,称为 局部 变量,存储在栈空间内。它的空间会在函数调用结束后自行释放。
- 如果是 全局 变量,存储在DATA段或者BSS段,它的空间是始终存在的,直至程序结束运行。
-
如果是
new
或者malloc
得到的空间,它存储在HEAP(堆)中,除非手动delete
或free
,否则空间会一直占用直至进程结束。
更多关于存储类型的信息,可以参考这篇博客: http://harttle.github.io/2015/07/22/memory-segment.html
想纠正一个问题,结构的属性能赋NULL吗?难道不是对结构指针赋NULL?
简单举个例子 int i=NULL;//printf("%d",i);会显示啥呢?
Deallocates the space previously
allocated
by
malloc(), calloc() or realloc()
. If ptr is null-pointer, the function does nothing.
看到了吗?如果你是动态分配的内存空间,那么你需要调用free来做内存空间的释放了。
反之,你是静态获得的内存空间,结构体的指针赋NULL,你只是让它指向的物理地址指到了空,结构的作用域不结束,内存空间就会被自动释放吗?这显然不符合变量的生命周期。
闷声发大财,这是坠吼滴!
,但lz你这样就是内存泄露啦。
C语言中内存分配会在三个地方:
-
堆
-
栈
-
寄存器
所谓的
栈
、
入栈
、
出栈
、
栈溢出
就是指这个,在函数中分配,在函数中释放,栈的空间比较小,变异的时候就分配啦。详情你可以去看看函数是如何调用的。你int a = 1024的时候就是在这分配的。
所谓的
堆
,我们先来聊聊虚拟内存。你一定听过这句户:
32位的系统最大寻址是4g
,这个寻址对应的就是你在堆上分配的内存,懂伐?32位下每个进程最多分配4g,内存是咋分配的不用你管,只需要找系统要就可以了,你malloc的时候就是在这儿分配的。
所谓的
寄存器变量
,就是
volatile
register
这个关键字修饰的变量,我也没用过,似乎是告诉寄存器这个变量尽量给用寄存器存储。可能做游戏的时候会遇到吧。
现在你明白为什么会内存泄露了么?系统给你4g内存分配的能力,不是说让你一定要用满这4g,而是你有分配的能力,用完记得还给系统,所以malloc需要free,new需要delete(C++)
(年代久远,可能有误,参考就好)