簡體   English   中英

通過hash_map迭代時的AV?

[英]AV while iterating through hash_map?

_transaction是我的類的私有成員變量,聲明為:

public:
    typedef stdext::hash_map<wchar_t*, MyClass*, ltstr> transaction_hash_map; 
private:
    transaction_hash_map _transactions;

在清理期間,我嘗試遍歷此列表並釋放所有仍未釋放的對象。 但是我在這里的for行上得到了一個AV:

for (transaction_hash_map::const_iterator it = _transactions.begin(); it != _transactions.end(); it++)
{   
            MyClass* item = (MyClass*)it->second;

    if (item != NULL)
    {
        item->End();
        delete item;
    }       
}

回復:什么是ltstr?

private:
    struct ltstr
    {
        enum
        {
            bucket_size = 8,
            min_buckets = 16
        };

        bool operator()(wchar_t* s1, wchar_t* s2) const
        {
            return wcscmp( s1, s2 ) < 0;
        }

        size_t operator()(wchar_t *s1) const
        {
            size_t  h = 0;

            wchar_t *p = const_cast<wchar_t*>(s1);
            wchar_t zero = L'\0';

            while ( *p != zero ) h = 31 * h + (*p++);

            return h;
        }
    };

堆棧將其顯示在begin()方法中。 有任何想法嗎?

據我了解,您正在針對NULL來檢查可能尚未刪除的“剩余”項目的指針。 但是對於在清理階段之前刪除的項目,是否將指針設置為NULL?

請注意,刪除對象時,指針不會自動設置為NULL。 因此,如果您不這樣做,則嘗試兩次刪除同一對象(因為if語句始終為true),這可能會導致訪問沖突。

下面的代碼是導致重復刪除的示例。 如果取消注釋將指針設置為NULL的行,則可以修復該問題。


#include <cstddef>

struct Item {};

int main()
{
  Item * p = new Item();
  delete p;

  //If you don't make the pointer null...
  //p = NULL;

  if (p != NULL)
      //You delete the object twice.
      delete p;
}

編輯:我看到您正完全為for上得到錯誤。 所以我想知道...

顯然,您有一個包含_transactions成員的MyClass ,該成員是一個以MyClass指針作為數據類型的哈希表。 如果清理代碼是在MyClass的成員函數中執行的,是否有可能由於某種原因而刪除了擁有要迭代的_transactionsMyClass實例?

在這種情況下,您可能會因為for對象中的it ++語句而出錯,因為對象不再存在。 (自然,錯誤也可能在其他地方,例如在刪除本身上。)

我可能想到的一件事是,在嘗試遍歷hash_map之前,您的類已在其他地方刪除,因此begin()將對垃圾進行操作。 值得一看...

另外-您的wchar_t *如何分配/釋放? 您顯示的代碼似乎與這些代碼無關。 我不確定這將如何在您的循環中造成麻煩,但是值得考慮。

一件小事-您不需要(MyClass*)強制轉換。 hash_map的值無論如何都應該是該類型的,因此讓編譯器強制執行類型檢查比使用顯式強制轉換繞過它們更好。 但是,這在這里應該沒有任何區別。

確保在for循環之后調用_transactions.clear()。

暫無
暫無

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

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