代码之家  ›  专栏  ›  技术社区  ›  Josh Weinstein

free是否从较小的结构指针中释放较大结构指针的所有内存?

  •  0
  • Josh Weinstein  · 技术社区  · 9 年前

    #include "stdio.h"
    #include "stdlib.h"
    
    //testing for garbage collection
    
    //base handler to ensure polymorphism
    #define BASE char g;
    
    struct temp {
      BASE
      short w;
    };
    
    struct femp {
      BASE
      short w;
      long d;
    };
    
    
    int main(void) {
      struct femp* first = malloc(sizeof(struct femp));
      first->d = 3444;
      struct temp* second = (struct temp*)first;
      free(second); // does this deallocate all the memory of first?
      free(first);
      return 0;
    }
    

    :如果第二个程序被释放,而不是第一个程序,则上述程序以非零状态退出。

    结果:

    7fb829d02000-7fb829d04000 rw-p 00000000 00:00 0 
    7fb829d0c000-7fb829d10000 rw-p 00000000 00:00 0 
    7fb829d10000-7fb829d11000 r--p 00023000 00:136 38                        /usr/lib/x86_64-linux-gnu/ld-2.24.so
    7fb829d11000-7fb829d12000 rw-p 00024000 00:136 38                        /usr/lib/x86_64-linux-gnu/ld-2.24.so
    7fb829d12000-7fb829d13000 rw-p 00000000 00:00 0 
    7fffac407000-7fffac428000 rw-p 00000000 00:00 0                          [stack]
    7fffac499000-7fffac49b000 r--p 00000000 00:00 0                          [vvar]
    7fffac49b000-7fffac49d000 r-xp 00000000 00:00 0                          [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
    exited with non-zero status
    

    free() 在指向一个较小的结构的指针上,它是从原始的malloc较大的结构转换而来的,仍然释放了所有内存?就像在我的代码中一样,释放第一个或第二个有什么区别吗?在释放之前,是否应该始终强制转换回原始类型?

    1 回复  |  直到 9 年前
        1
  •  3
  •   Lee Daniel Crocker    9 年前

    malloc() / free() 对你的结构一无所知。 malloc() 免费() 获取该地址,并释放分配的任何内容。在此期间,你用它做什么取决于你自己。

    如果你需要一些可能包含两件事中的一件的内存,那么你需要确保它足够大。如果你分配一个5加仑的桶,只用来装3加仑,那很好。如果你试着搬7加仑,你的脚会湿透的。C也不会干扰您的操作。