【问题标题】:Does free deallocate all the memory of a larger struct pointer from a smaller one?free 是否会从较小的结构指针中释放较大结构指针的所有内存?
【发布时间】: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 不关心结构或字符或任何东西。它只是释放指针指向的内存,仅此而已。
  • 是的,但是如果我释放指向从较大结构(在本例中为第二个)投射的结构的指针,我的问题中的上述程序将以非零状态退出,这促使我问这个问题。

标签: c struct free


【解决方案1】:

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

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

【讨论】:

  • 好吧,这是有道理的,但是为什么在这种情况下释放指向较小结构的指针会导致非零状态?
  • 因为你要释放同一个地址两次。
猜你喜欢
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多