- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我花了几个小时在free()实现中的一个特定条件上。我已经搜索了网络和stackoverflow以查看是否还有其他人对此进行了讨论,但没有发现任何问题。我了解第二版(ANSI)第187和188页中介绍的3个功能背后的总体思路。我是专业人士,大多数代码对我来说都是有意义的,但是当我确定所有3个函数在第一次调用时如何工作(换句话说,将* freep初始化为某种东西)时,我感到很沮丧。
这是我从代码中得出的步骤:
步骤1.定义了两个全局变量,如下所示
typedef long Align;
union header { /* block header */
struct {
union header *ptr; /* next block if on free list */
unsigned size; /* size of this block */
} s;
Align x; /* force alignment of blocks */
};
typedef union header Header;
static Header base; /* empty list to get started */
static Header *freep = NULL; /* start of free list */
/* malloc: general-purpose storage allocator */
void *malloc(unsigned nbytes)
{
Header *p, *prevp;
Header *morecore(unsigned);
unsigned nunits;
nunits = (nbytes+sizeof(Header)-1)/sizeof(header) + 1;
if ((prevp = freep) == NULL) { /* no free list yet */
base.s.ptr = freeptr = prevptr = &base;
base.s.size = 0;
}
for (p = prevp->s.ptr; ; prevp = p, p = p->s.ptr) {
if (p->s.size >= nunits) { /* big enough */
if (p->s.size == nunits) /* exactly */
prevp->s.ptr = p->s.ptr;
else { /* allocate tail end */
p->s.size -= nunits;
p += p->s.size;
p->s.size = nunits
}
freep = prevp;
return (void *)(p+1);
}
if (p == freep) /* wrapped around free list */
if ((p = morecore(nunits)) == NULL)
return NULL; /* none left */
} // end of for loop
}
Header *up;
up = the memory from OS
up->s.size = nu; (number of units, each of size = sizeof(Header))
free( (void*) (up+1) );
return freep;
void free( void* ap)
{
Header *bp, *p; // a pointer to base (ie. Header) and a temporary pointer p.
bp = (Header *)ap - 1; // point to block header
for (p = freep; !(bp > p && bp < p->s.ptr) ; p = p->s.ptr)
if ( p >= p->s.ptr && (bp > p || bp < p->s.ptr) )
break; // freed block at start or end of arena.
if(bp + bp->s.size == p->s.ptr) { // join to upper nbr
bp->s.size += p->s.ptr->s.size;
bp->s.ptr = p->s.ptr->s.ptr;
}
else bp->s.ptr = p->s.ptr;
if (p + p->s.size == bp) {
p->s.size += bp->s.size;
p->s.ptr = bp->s.ptr;
}
else p->s.ptr = bp;
freep = p;
最佳答案
为什么要将此新指针设置为“基本”全局地址?
在malloc实现的描述中,据说最后一个块具有指向第一个块的指针。而且由于第一次调用函数,您没有任何块,因此该块指向自身。
因此,下一条语句freep = p在我们第一次遍历malloc / morecore / free的序列时是多余的?在所有这些步骤的最后,freep仍指向“base”的地址?没有变化 ?感觉像我在逻辑上犯了一些错误。
我相信,在第一次调用malloc时,您对 freep = p = &base
的推理没有错误。
我认为,一般而言,这段代码非常棘手。在这个问题(Explain this implementation of malloc from the K&R book)中,您可以找到更多关于k&r malloc()
实现的评论
但是对于您的情况,我认为free()
名称使您有些困惑。因为函数free()
实际上具有两个目的:初始化全新的空闲列表,以及显然释放先前分配的内存。 S.Macconnell的“代码完成”也说,具有多种用途的功能不是一个好主意。
因此,在第一遍中,是的,实际上,您不需要其他分配(初始化free()
的机制)。但是在下一次调用free
(真正释放先前分配的内存的方式)时,使用指向空闲列表内存的最后一块的指针来合并内存很有用。
关于ANSI标准C关于联合的说明,有一点需要澄清。这可以追溯到我上面带有“typedef”的第一个代码片段。我认为静态联合(例如静态Header base)内的所有成员都由编译器初始化为零?
是的,引用c89 draft(3.5.7。初始化):
如果具有静态存储持续时间的对象未初始化
显式地,它隐式地初始化,就像每个具有
算术类型分配了0,每个成员都具有指针类型
被分配了一个空指针常量。如果对象具有自动
存储持续时间未明确初始化,其值为
不定。
如果我没有将它们声明为静态的怎么办?在这种情况下,结构s.header ptr是否为NULL?
我相信这将是垃圾。
关于c - Kernighan和Ritchie malloc自由逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23483484/
这是我正在调试的函数: boolean adin_memory(char* buffer, int size_chunck, int end_flag){ global_buffer = my
我正在尝试为具有自由 float 底座的机器人计算末端执行器空间速度雅可比行列式。由于自由 float 基数,雅可比应该包含一个基数组件和一个操纵器注释(参见 https://spart.readth
procedure FreeListObjects( l : TStrings); var i : integer; BEGIN FOR i := 0 TO l.Count -1 DO BEG
我正在探索 Haskell 中的选项,这些选项可以让我将业务逻辑与底层系统的技术实现分开。例如,在 Web 服务器的上下文中,将 Web 服务器处理其接收的信息的方式与其读取和写入数据库的方式分开。要
我的目标是使用来自 ActiveMQ 的 WebSphere Liberty Appserver(完整的 Java EE 标准)使用消息。不幸的是,我不知道如何配置 WebSphere Liberty
我以这种方式分配了一个非方阵,但我不确定我是否正确使用了释放 float **matrix_alloc(int m /* rows */, int n /* columns */) { int
我在阅读 refuting the notion 之后的第 13.5 节内置运算符不参与重载决议,并注意到没有关于 operator->* 的部分。它只是一个通用的二元运算符。 它的兄弟operato
我正在尝试使用 Libelf 库来获取有关某些 elf 文件的一些信息。但我不断收到这些“对 [...] 的 undefined reference ”。我从 synaptic 安装了 libelf(
我有创建动态结构数组的波纹管代码。 #include #include #include typedef struct { int flag; char* ip; } ip_mo
我是 StackOverflow 的新人。我现在正在学习C指针。 这是我的代码: #include #include int alloc(int* p){ p = (int*) mallo
我是 StackOverflow 的新人。我现在正在学习C指针。 这是我的代码: #include #include int alloc(int* p){ p = (int*) mallo
我正在用 C 编写一个程序,我需要读入一个文件并打印出每个至少 4 个字符长的字符串。我在分配要使用的内存时遇到问题。字符串可以任意长。我试图将缓冲区分配给文件的大小,然后在最后释放它,但我显然错过了
我尝试用 C 语言编写 ls 命令,但 -R 选项有问题。 输出: /Applications/Atom.app/Contents/Resources/app/apm/node_modules/es5
我正在编写一个 shell,但在执行内存检查时遇到问题,因为 valgrind 无法正常运行。 我遇到了这样的错误(我自己杀死了它): ==19703== Memcheck, a memory err
我有这样一段代码: void *write_parallel(void *num_for_chunk) { struct rusage *sum = (struct rusage*) mall
当使用包含 200-300 个整数(以空格分隔)的输入 .txt 文件运行此代码时,我在使用 fprintf 语句的 for 循环之前收到错误。 我不确定 qsort 是否导致了此错误或为什么会发生此
我试图告诉 Websphere Liberty 我的 log4j2.xml 文件在哪里,但它不起作用。 在我的文件 jvm.options 中,我配置: -Dlog4j.configurationFi
从 websphere liberty 16 迁移到 19.0.0.1 我遇到以下异常:运行存储过程后关闭连接,出现以下异常: EJB threw an unexpected (non-declare
当对大小为 210*8 的种子数据集运行此代码时,我在预测函数中的 qsort() 行之后收到错误。它不在 qsort() 之后执行。 我不确定 qsort 是否导致了此错误或为什么会发生此错误,但如
这个问题已经有答案了: Facing an error "*** glibc detected *** free(): invalid next size (fast)" (2 个回答) 已关闭 9
我是一名优秀的程序员,十分优秀!