我正在尝试将内存地址或指针类型用作键和值,但出于某种原因,我在插入时会出现访问冲突。
class SomeClass
{
public:
std::map<MyClass*, MyClass*> stlMapPointer;
std::map<size_t, size_t> stlMapAddress;
CMap<MyClass*, MyClass*, MyClass*, MyClass*> mfcMapPointer;
CMap<size_t, size_t, size_t, size_t> mfcMapAddress;
}
SomeOtherClass
{
public:
SomeClass *m_someClassRef;
void SomeOtherClass::some_method(MyClass* ptr, ...);
}
void SomeOtherClass::some_method(MyClass* ptr, ...)
{
MyClass* test = ptr;
size_t address = reinterpret_cast<size_t>(test); // I realize size_t is technically not portable
// PROBLEM STARTS HERE: Every single one of the following insertions will yield an access violation while calling various internal CMap/std::map calls.
m_someClassRef->stlMapPointer.insert(std::pair<MyClass*, MyClass*>(test, test));
m_someClassRef->stlMapPointer.insert(std::pair<size_t, size_t>(address, address));
m_someClassRef->mfcMapPointer.SetAt(test, test);
m_someClassRef->mfcMapAddress.SetAt(address, address);
}
MyClass没有复制构造函数,但我认为这是无关紧要的。我也坚持使用Visual Studio 6,如果这完全相关的话。
关于为什么会发生这种情况的任何想法?
谢谢!
答案 0 :(得分:0)
对于那些好奇的人:问题是在应用程序的其他地方,在SomeClass实例上调用了一个memset来初始化内存。
是什么让这个问题困扰(在注意到memset之前):地图成员是常规实例成员(而不是指针),导致非常奇怪的结果,其中Map成员显然存在但处于不良状态。 / p>
感谢这些评论,我想到尝试将SomeClass地图成员改为指针(例如CMap * mfcMapAddress)。瞧,即使在我的构造函数创建CMap实例后,指针值也会被擦除为零。
谢谢!