c++ - C语言销毁一个结构体不free直接等于NULL可以吗
黄舟
黄舟 2017-04-17 12:04:40
0
9
859

各位大神 如果我一个结构体 的某个属性存了1000个数据 然后现在不想用了 我直接 把这个结构体的这个属性 == NULL 是不是就表示 这个结构体 又成了一个全新的结构体了 但是 我并没有free 那么是不是 堆内存里面 始终有一块区域没有被回收呢?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

membalas semua(9)
Peter_Zhu

变量所占内存的回收方式取决于该变量的存储类型(storage class),对于你讲的结构体而言:

  1. 如果是在函数内定义的,称为 局部 变量,存储在栈空间内。它的空间会在函数调用结束后自行释放。
  2. 如果是全局变量,存储在DATA段或者BSS段,它的空间是始终存在的,直至程序结束运行。
  3. 如果是new或者malloc得到的空间,它存储在HEAP(堆)中,除非手动deletefree,否则空间会一直占用直至进程结束。

更多关于存储类型的信息,可以参考这篇博客: 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语言基础

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!