C free是否从较小的结构指针释放较大结构指针的所有内存?
因此,我试图用C实现一个多态系统,类似于PyObject和Python对象系统。但是,我很难理解如何从基本结构释放结构强制转换。我已经实现了以下基本和高级结构类型:C free是否从较小的结构指针释放较大结构指针的所有内存?,c,struct,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; }
#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()
对您的结构一无所知malloc()
接受一个整数参数并分配这么多字节,从而为您提供一个内存地址free()
获取该地址,并释放分配的任何内容。在此期间,你如何处理它取决于你自己
如果你需要一些可能包含两件事情中的一件的内存,那就由你来确定它是否足够大。如果你分配一个5加仑的桶,只用来装3加仑,那就好了。如果你想搬7加仑,你会被淋湿的。C也不会干扰您的操作。malloc()
/free()
对您的结构一无所知malloc()
接受一个整数参数并分配这么多字节,从而为您提供一个内存地址free()
获取该地址,并释放分配的任何内容。在此期间,你如何处理它取决于你自己
如果你需要一些可能包含两件事情中的一件的内存,那就由你来确定它是否足够大。如果你分配一个5加仑的桶,只用来装3加仑,那就好了。如果你想搬7加仑,你会被淋湿的。C也不会干扰您的操作。您不“分配结构”,而是分配内存量。Malloc接受一个整数参数,它是一个字节数。Free只释放所释放的字节数。两人都不知道结构。free
将指针指向void
。所以它真的不在乎它之前被铸造成什么。好吧,这意味着你必须释放()任何大小的结构最初是malloc的?正确吗?@JoshWeinstein,free
不关心结构、字符或任何东西。它只是释放一个指针指向的内存,仅此而已。是的,但是如果我释放一个指针指向一个从一个更大的结构(在本例中为第二个结构)铸造的结构,我问题中的上述程序将以非零状态退出,这促使我问这个问题。你不是“分配结构”,而是分配大量内存。Malloc接受一个整数参数,它是一个字节数。Free只释放所释放的字节数。两人都不知道结构。free
将指针指向void
。所以它真的不在乎它之前被铸造成什么。好吧,这意味着你必须释放()任何大小的结构最初是malloc的?正确吗?@JoshWeinstein,free
不关心结构、字符或任何东西。它只是释放一个指针指向的内存,仅此而已。是的,但是如果我释放一个指针指向一个从一个更大的结构(本例中是第二个)铸造的结构,我问题中的上述程序将以非零状态退出,这促使我问这个问题。好的,这是有意义的,但是为什么在这种情况下释放指向较小结构的指针会导致非零状态?因为释放同一地址两次。好的,这是有道理的,但是为什么在这种情况下释放指向较小结构的指针会导致非零状态?因为释放同一地址两次。