This file是GoAhead WebServer的一部分,它实现了一种非常快速的块分配方案。
在第284行,Web服务器进程随机崩溃。
} else if ((bp = bQhead[q]) != NULL) {
/*
* Take first block off the relevant q if non-empty
*/
bQhead[q] = bp->u.next; //MEMORY ACCESS VIOLATION HERE
可能的原因是什么?
修改
bp是this header file
typedef struct {
union {
void *next; /* Pointer to next in q */
int size; /* Actual requested size */
} u;
int flags; /* Per block allocation flags */
} bType;
感谢。
答案 0 :(得分:5)
这是可能的原因。
您搞砸了一些内容并损坏了部分数据结构或堆栈。
bQhead
是NULL或无效指针
q
超出了bQhead
bp
是NULL或无效指针
使用调试器逐步执行代码,或使用printf调试,并查看bQhead,q,bp的值是否应该是。
答案 1 :(得分:1)
给我们更多提示......
可能是另一个线程的内存损坏,如果它是随机的......
MY2C
答案 2 :(得分:1)
如果没有在调试器下运行,我猜测q超出了0到B_MAXCLASS-1的范围。设置q的函数ballocGetSize()
不进行任何边界检查以确保块类保持在边界内。
在引用之前检查q是否在边界内的简单断言将规定可能性。