【问题标题】:Memory Deallocation Simulation Issue内存释放模拟问题
【发布时间】:2016-04-30 18:46:24
【问题描述】:

我正在模拟一个带有静态结构数组的内存块,其形式为:

typedef struct memBlock
{
  unsigned int isAllocated = 0;
  unsigned int processID = 0;
}memBlock;

我已经有一个类似malloc() 的函数,它将通过从进程中获取请求的内存大小并通过将 isAllocated 设置为 1 并将 PID 更改为请求进程的进程 ID。

所以现在我想编写一个类似free 的函数,通过将isAllocated 设置为0 并将PID 设置为0,从这个数组中释放“内存”,但我应该如何实现呢?我从概念上知道我需要从这个数组的索引 0 开始,并且可能检查 isAllocated = 1 和非零 PID 的第一个索引,对吗? 到目前为止,我已经实现了这个:

void* custom_free(void* ptr, unsigned int size)
{
    unsigned int blockIndex = 0, sizeCount = 0, startIndex = 0;
    if(ptr){ free(ptr); }
}

编辑:在我的代码前面,我对 memBlock 结构进行了 malloc 调用,如下所示:

memBlock *block = (memBlock *)malloc(BLOCK_SIZE);

其中BLOCK_SIZE 是预处理器定义的常量

【问题讨论】:

  • @WhiZTiM 删除 C++ 标记可能为时过早,因为像 memBlock 结构中所示的结构成员的内联初始化在 C 中是不可能的,但在 C++ 中是不可能的。
  • 这不是 C,而是 C++。您应该使用 C++ new/delete 运算符。并删除 C 标签。
  • 也许你不明白我的评论。重复一遍:这不是 C 代码,而是 C++ C 和 C++ 是不同的语言,您需要使用正确的标记。
  • 是的,我之前删除了 C++ 标签。它不是 C++。
  • @JoachimPileborg,注意到。下次我不会着急的。 :: 尽管如此,我只是笑了笑检查这篇文章的修订历史......标签战争:-)

标签: c memory-management simulation


【解决方案1】:

分配器存储有关已分配内存块的信息的常用方法是将信息结构存储在它分配的内存块中。

因此,不是分配size 字节,而是分配size + sizeof(memBlock) 字节,并将指针用作指向memBlock 结构的指针并填写您需要的信息。然后在memBlock 结构之后返回一个指向内存的指针(即类似于&((memBlock *) ptr)[1])。

释放时减去memBlock 结构的大小以获得指向memBlock 结构的原始指针。

这当然会让isAllocated 这样的成员变得毫无用处。如果您有自己的块,并且只分配这些块的倍数,则需要存储有关分配了哪些块以及块数的信息。

【讨论】:

  • 这更有意义,但具体为什么isAllocatednow 没用了?除了使用isAllocated,我还能如何区分占用和空块?
猜你喜欢
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 2010-10-03
  • 2011-07-14
相关资源
最近更新 更多