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

标签 c struct free

所以,我正在尝试用 C 实现一个多态系统,类似于 PyObject 和 Python 对象系统。但是,我无法理解如何释放从基本结构转换而来的结构。我已经实现了以下基本和高级结构类型:

#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

我的问题是,在从原始 malloc 的较大尺寸结构转换而来的较小尺寸结构的指针上调用 free() 是否仍然释放所有内存?就像在我的代码中一样,首先释放或第二次释放有什么区别吗?是否应该在释放之前始终转换回原始类型?

最佳答案

malloc()/free() 对您的结构一无所知。 malloc() 接受一个整数参数并分配那么多字节,为您提供一个内存地址。 free() 获取该地址,并释放分配的任何内容。在此期间你用它做什么取决于你。

如果您需要一些可能容纳两件事之一的内存,则由您来确保它足够大。如果你分配一个 5 加仑的桶,只用它来装 3 加仑的水,那很好。如果你试图携带 7 加仑,你会弄湿你的脚。 C 不会干扰你做任何事情。

关于c - free 是否会从较小的结构指针中释放较大结构指针的所有内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45221044/

相关文章:

c - 多维字符数组?

c - 在整个程序的头文件中共享变量和结构

c - 同时使用 && || 进行短路评估运算符(operator)

c - #define宏,用于在C中进行调试打印?

c - 如何释放具有二维数组作为属性的二维结构

linux - free -g 与 sed -n 加第 n 个字符

c++ - 在 C/C++ 中实现 RSA 的开源代码(使用库或自己编写)

用C创建客户端时出现编译错误

c++ - 标记字符串

c++ - 作为 const 引用传递的结构体中元素的值可以修改吗?