【发布时间】:2009-09-29 17:46:17
【问题描述】:
_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;
}
}
Re: 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() 方法中显示它。有什么想法吗?
【问题讨论】:
-
您省略的代码很好实际上是导致错误的常见原因。例如,如果您要从哈希表中删除一项并且没有正确设置 it (迭代器)(当然取决于哈希实现)。
-
您确定您没有尝试从已删除的对象中清理地图吗?
-
谢谢大家,我编辑了我的帖子以包含更多代码。澄清一下,在 WINDBG 内部,AV 显示在 hash_map 本身的 begin() 方法内部。
-
MyClass 为什么重要。作为练习,即使我删除了 for 循环内的部分,它仍然是 AV 的。
标签: c++ stl hashmap access-violation