簡體   English   中英

TAILQ_REMOVE為什么不重置頭指針?

[英]Why doesn't TAILQ_REMOVE reset the head pointer?

我正在跟蹤一些我未編寫的代碼中的一些Coverity錯誤。 在一種情況下,我們在循環中使用TAILQ_FIRST和TAILQ_REMOVE,如下所示:

while (!TAILQ_EMPTY(&queue))
{
    item* entry = TAILQ_FIRST(&queue);
    TAILQ_REMOVE(&queue, entry, next);
    free(entry);
}

Coverity對此抱怨很多,說我要雙重釋放。 但是,查看TAILQ_REMOVE可能是正確的:(在我的Linux機器上為/usr/include/x86_64-linux-gnu/sys/queue.h

#define TAILQ_REMOVE(head, elm, field) do {                             \
        if (((elm)->field.tqe_next) != NULL)                            \
                (elm)->field.tqe_next->field.tqe_prev =                 \
                    (elm)->field.tqe_prev;                              \
        else                                                            \
                (head)->tqh_last = (elm)->field.tqe_prev;               \
        *(elm)->field.tqe_prev = (elm)->field.tqe_next;                 \
} while (/*CONSTCOND*/0)

與其他一些相關宏不同,在這里我看不到任何刪除頭節點會重置tqe_first 因此,我將繼續在循環中獲取已刪除的節點。

但是我真的不明白發生了什么。 盡管存在Coverity警告,但此代碼似乎仍然有效。

為此很難在網上找到實例。

這是tqe_prev因為tqe_prev是指向指針的指針。 如果非空,在隊列中的第一個元素都有tqe_prev字段初始化為地址tqe_first 因此,如果要刪除第一個元素,則像在宏的最后一行中那樣對它進行引用和分配,最終將設置tqh_first (通常, tqe_prev具有上一個節點的tqe_next指針的地址。)

暫無
暫無

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

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