簡體   English   中英

為什么我在這里遇到內存訪問沖突?

[英]Why am I getting a memory access violation here?

該文件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是指向此結構的指針,並在此頭文件中進行並集

typedef struct {
    union {
        void    *next;                          /* Pointer to next in q */
        int     size;                           /* Actual requested size */
    } u;
    int         flags;                          /* Per block allocation flags */
} bType;

謝謝。

這是可能的原因。

  • 您已經搞砸了,破壞了某些數據結構或堆棧。

  • bQhead是NULL或無效的指針

  • q超出bQhead的范圍

  • bp是NULL或無效的指針

使用調試器單步執行代碼,或使用printf調試,然后查看bQhead,q,bp的值是否應為應有的值。

給我們更多提示...

如果是隨機的,則可能是另一個線程破壞了內存...

my2c

如果不在調試器下運行,我可能會認為q超出了0到B_MAXCLASS-1的范圍。 設置q的函數ballocGetSize()不會進行任何邊界檢查以確保塊類保持在邊界內。

一個簡單的斷言可以在延遲之前檢查q是否在范圍之內,從而排除了可能性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM