c - C 中的动态内存释放

标签 c memory-management glibc

我有这 2 个结构和 4 个常量:

#define MAX_BLK 16
#define MAX_STR 32
#define C_TRUE  1
#define C_FALSE 0

typedef struct {
  int  rsv;
  void *addr;
  int   size;
  char  tag[MAX_STR];
} BlockType;

typedef struct {
  int numBlocks;
  BlockType *blocks;
} HeapType;

这是我初始化堆结构的函数:

void mh_init(HeapType *heap) {
  heap->numBlocks = 0;
  heap->blocks = (BlockType *) malloc(sizeof(BlockType[MAX_BLK]));
}

这是我分配新 block 的函数(创建一个 n 字节的 block ,将新 block 和信息添加到 heap->blocks 数组,然后返回新内存块的指针):

void *mh_alloc(HeapType *heap, int n, char *label) {
  void *newAddr = (void*) malloc(n);
  heap->blocks[heap->numBlocks].addr = newAddr;
  heap->blocks[heap->numBlocks].rsv = C_TRUE;
  heap->blocks[heap->numBlocks].size = n;
  strcpy(heap->blocks[heap->numBlocks].tag, label);
  heap->numBlocks += 1;
  return newAddr;
}

最后,释放每个 block 和堆结构:

void mh_cleanup(HeapType *heap) {
  for (int i = 0; i < heap->numBlocks; i++) {
    printf("block %d\n", i);
    free_block(&heap->blocks[i]);
  }
  free(&heap->numBlocks);
  free(heap->blocks);
}

void free_block(BlockType *block) {
  free(&(block->rsv));
  printf(" freed: rsv,");
  if (block->addr != NULL) { free(block->addr);  }
  printf("adr, ");
  free(&(block->size));
  printf("size, ");
  free(block->tag);
  printf("tag\n");
}

一切都编译得很好,但是当我运行时,我不断收到 glibc 错误:“* glibc detectors * ./a3: free(): invalid point: 0x002b6470 ***”

我做了一个小时左右的研究,认为这个错误意味着我向 free() 传递了一个无效的地址。基本上它会打印出 block 0,释放 rsv,但然后什么也不做。谁能告诉我我的方法哪里出了问题?

***注意我的程序还有其他部分,但认为它们对于这个问题并不重要

最佳答案

这看起来真的很可疑:

  free(&(block->rsv));

您应该只传递从 malloc 获得的 free 指针。在本例中,您将传递一个指向您分配的结构中的 int 的指针。如果您正在操作分配的数组中的第二个结构,那么这肯定不是您从 malloc 获得的指针。如果它是第一个元素,如果它与指向数组的指针相同(不确定是否保证),则可能会释放整个数组,在这种情况下,函数的其余部分将在free上运行内存力很差。

关于c - C 中的动态内存释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26633177/

相关文章:

c++ - Libc hypert 函数似乎为 double 类型返回错误的结果...为什么?

c - 简单程序将 "D"添加到输出

java - 如何使用 java 有效地加载 native 共享对象

ios - 用于转发到 Objective-C 中复制的属性的正确属性语义

c - fork() 的异步信号安全

linux - aerospike服务启动错误/usr/bin/asd :/lib/x86_64-linux-gnu/libc. so.6: version `GLIBC_2.14' not found (required by/usr/bin/asd)

c - 将几个标志和小枚举作为函数参数传递 : hand-made int bitmasks or small struct?

c - 信号终止处理程序和清理操作

c - 如果源代码在 win32 中是 UTF-8 编码的,如何显示 UTF-16 const 字符串?

memory-management - 为什么有人会使用最适合的内存分配?