C语言销毁一个结构体不free直接等于NULL可以吗
各位大神 如果我一个结构体 的某个属性存了1000个数据 然后现在不想用了 我直接 把这个结构体的这个属性 == NULL 是不是就表示 这个结构体 又成了一个全新的结构体了 但是 我并没有free 那么是不是 堆内存里面 始终有一块区域没有被回收呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
变量所占内存的回收方式取决于该变量的存储类型(storage class),对于你讲的结构体而言:
new
或者malloc
得到的空间,它存储在HEAP(堆)中,除非手动delete
或free
,否则空间会一直占用直至进程结束。更多关于存储类型的信息,可以参考这篇博客: http://harttle.github.io/2015/07/22/memory-segment.html
闷声发大财,这是坠吼滴!
,但lz你这样就是内存泄露啦。C语言中内存分配会在三个地方:
堆
栈
寄存器
所谓的
栈
、入栈
、出栈
、栈溢出
就是指这个,在函数中分配,在函数中释放,栈的空间比较小,变异的时候就分配啦。详情你可以去看看函数是如何调用的。你int a = 1024的时候就是在这分配的。所谓的
堆
,我们先来聊聊虚拟内存。你一定听过这句户:32位的系统最大寻址是4g
,这个寻址对应的就是你在堆上分配的内存,懂伐?32位下每个进程最多分配4g,内存是咋分配的不用你管,只需要找系统要就可以了,你malloc的时候就是在这儿分配的。所谓的
寄存器变量
,就是volatile
register
这个关键字修饰的变量,我也没用过,似乎是告诉寄存器这个变量尽量给用寄存器存储。可能做游戏的时候会遇到吧。现在你明白为什么会内存泄露了么?系统给你4g内存分配的能力,不是说让你一定要用满这4g,而是你有分配的能力,用完记得还给系统,所以malloc需要free,new需要delete(C++)
(年代久远,可能有误,参考就好)
对,这块区域一直没有被回收。等程序结束后,它才会被释放掉。
关键还是看你的数据空间是怎么分配的,
如果是编译器分配的,那无所谓,离开作用域就自动回收了。
如果你是用
malloc
之类的函数手工代码分配的,那就必须在适当的位置free
想纠正一个问题,结构的属性能赋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,你只是让它指向的物理地址指到了空,结构的作用域不结束,内存空间就会被自动释放吗?这显然不符合变量的生命周期。
结构体你要是分配了堆内存 必须free();
当然不可以,在你说的情境中,直接将指针置为NULL,那么那块内存还是被结构体实体占用的,但是因为你将指针置为NULL,就没有指针指向这块被使用的内存,就丢失了这块内存的地址,就会造成内存的泄露,直到你的程序退出时候才会释放这块内存。
但是如果你的程序是一直运行的,比如像很多服务器是需要7*24运行的,那么丢失的内存将一直无法释放,可能导致你的内存慢慢的泄露,最后只能重启系统
按照你说的结构体的属性可以赋值为NULL,假定这个属性是一个指针,又说这个属性没有free,假定这个属性的值是malloc返回的一个指针值。在这种情况下,将这个属性赋值为NULL,malloc分配的内存空间还在堆中,如果这个属性是这块内存空间的最后一个指针,将该指针设置为NULL后,没人引用这块内存空间,那么这个内存空间就发生泄漏了,再也回收不了,直到进程退出。
一楼回答的比较详细,你还是多看看c语言基础