【发布时间】:2017-07-20 17:05:09
【问题描述】:
所以,我试图在 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
我的问题是,在指向较小结构的指针上调用 free() 是否仍然释放所有内存?就像在我的代码中一样,释放第一个或第二个有什么区别吗?是否应该在释放前始终转换回原始类型?
【问题讨论】:
-
您不是“分配结构”,而是分配大量内存。 Malloc 接受一个整数参数,它是字节数。 Free 只是释放了许多字节。两人都不知道结构。
-
free将指针指向void。所以它真的不在乎它之前被转换成什么。 -
好的,所以这意味着你必须释放()任何大小的结构体最初是 malloc 的?对吗?
-
@JoshWeinstein,
free不关心结构或字符或任何东西。它只是释放指针指向的内存,仅此而已。 -
是的,但是如果我释放指向从较大结构(在本例中为第二个)投射的结构的指针,我的问题中的上述程序将以非零状态退出,这促使我问这个问题。