为什么我在这里遇到内存访问冲突?

时间:2011-01-25 19:27:10

标签: c memory memory-management memory-leaks webserver

This fileGoAhead 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;

感谢。

3 个答案:

答案 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是否在边界内的简单断言将规定可能性。