代码之家  ›  专栏  ›  技术社区  ›  esac

迭代哈希图时的AV?

  •  0
  • esac  · 技术社区  · 15 年前

    _事务是我的类的私有成员变量,声明为:

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

    在清理过程中,我试图遍历这个列表,释放仍然未释放的任何对象。不过,我有一个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()方法中显示它。有什么想法吗?

    3 回复  |  直到 15 年前
        1
  •  0
  •   Peter    15 年前

    我能想到的一个可能的事情是,在您尝试遍历hash_映射之前,您的类已经在其他地方被删除,因此begin()将在垃圾上操作。值得一看…

    另外-您的wchar-t*如何分配/释放?您显示的代码似乎没有处理这些问题。我不知道这会给你的回路带来什么麻烦,但值得考虑。

    一件小事-你不应该需要 (MyClass*) 铸造。hash-map的值无论如何都应该是该类型的,因此让编译器强制执行类型检查比使用显式强制转换可能绕过它们更好。不过,这在这里不会有什么不同。

        2
  •  0
  •   Leandro T. C. Melo    15 年前

    据我所知,您正在检查指针是否为空,以查找可能尚未删除的“剩余”项。但是对于在清理阶段之前删除的项目,是否将指针设置为空?

    请注意,删除对象时,指针是 自动设置为空。因此,如果您不这样做,那么您将尝试删除同一对象两次(因为if语句始终为true),这可能导致访问冲突。

    下面的代码是导致双重删除的示例。如果取消对将指针设置为空的行的注释,则可以修复此问题。

    
    #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;
    }
    

    编辑: 我看到你的错误就在 对于 线。所以我想知道…

    很明显你有 类名 包含一个 股票交易 成员,它是具有 类名 指针作为数据类型。如果清除代码是在 类名 ,是否有可能(出于某种原因)删除 类名 拥有的实例 股票交易 你在重复?

    在这种情况下,您可能会在 资讯科技+ 语句内部 对于 自从 对象不再存在。(当然,错误也可能出现在其他地方,比如删除本身。)

        3
  •  0
  •   Andre    15 年前

    确保在for循环之后调用_transactions.clear()。