所以,我正在尝试用 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/