ホームページ  >  に質問  >  本文

c++ - C语言销毁一个结构体不free直接等于NULL可以吗

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

黄舟黄舟2765日前860

全員に返信(9)返信します

  • 天蓬老师

    天蓬老师2017-04-17 12:06:40

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

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

    更多关于存储类型的信息,可以参考这篇博客: http://harttle.github.io/2015/07/22/memory-segment.html

    返事
    0
  • 黄舟

    黄舟2017-04-17 12:06:40

    闷声发大财,这是坠吼滴!,但lz你这样就是内存泄露啦。

    C语言中内存分配会在三个地方:

    • 寄存器

    所谓的入栈出栈栈溢出就是指这个,在函数中分配,在函数中释放,栈的空间比较小,变异的时候就分配啦。详情你可以去看看函数是如何调用的。你int a = 1024的时候就是在这分配的。

    所谓的,我们先来聊聊虚拟内存。你一定听过这句户:32位的系统最大寻址是4g,这个寻址对应的就是你在堆上分配的内存,懂伐?32位下每个进程最多分配4g,内存是咋分配的不用你管,只需要找系统要就可以了,你malloc的时候就是在这儿分配的。

    所谓的寄存器变量,就是volatile register这个关键字修饰的变量,我也没用过,似乎是告诉寄存器这个变量尽量给用寄存器存储。可能做游戏的时候会遇到吧。


    现在你明白为什么会内存泄露了么?系统给你4g内存分配的能力,不是说让你一定要用满这4g,而是你有分配的能力,用完记得还给系统,所以malloc需要free,new需要delete(C++)

    (年代久远,可能有误,参考就好)

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-17 12:06:40

    对,这块区域一直没有被回收。等程序结束后,它才会被释放掉。

    返事
    0
  • 大家讲道理

    大家讲道理2017-04-17 12:06:40

    关键还是看你的数据空间是怎么分配的,

    如果是编译器分配的,那无所谓,离开作用域就自动回收了。
    如果你是用 malloc 之类的函数手工代码分配的,那就必须在适当的位置 free

    返事
    0
  • 怪我咯

    怪我咯2017-04-17 12:06:40

    想纠正一个问题,结构的属性能赋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,你只是让它指向的物理地址指到了空,结构的作用域不结束,内存空间就会被自动释放吗?这显然不符合变量的生命周期。

    返事
    0
  • ringa_lee

    ringa_lee2017-04-17 12:06:40

    结构体你要是分配了堆内存 必须free();

    返事
    0
  • ringa_lee

    ringa_lee2017-04-17 12:06:40

    当然不可以,在你说的情境中,直接将指针置为NULL,那么那块内存还是被结构体实体占用的,但是因为你将指针置为NULL,就没有指针指向这块被使用的内存,就丢失了这块内存的地址,就会造成内存的泄露,直到你的程序退出时候才会释放这块内存。

    但是如果你的程序是一直运行的,比如像很多服务器是需要7*24运行的,那么丢失的内存将一直无法释放,可能导致你的内存慢慢的泄露,最后只能重启系统

    返事
    0
  • 怪我咯

    怪我咯2017-04-17 12:06:40

    按照你说的结构体的属性可以赋值为NULL,假定这个属性是一个指针,又说这个属性没有free,假定这个属性的值是malloc返回的一个指针值。在这种情况下,将这个属性赋值为NULL,malloc分配的内存空间还在堆中,如果这个属性是这块内存空间的最后一个指针,将该指针设置为NULL后,没人引用这块内存空间,那么这个内存空间就发生泄漏了,再也回收不了,直到进程退出。

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-17 12:06:40

    一楼回答的比较详细,你还是多看看c语言基础

    返事
    0
  • キャンセル返事