使用指针/地址作为CMap或std :: map中的键和值时的访问冲突

时间:2012-11-14 23:14:07

标签: c++ visual-c++ stl mfc

我正在尝试将内存地址或指针类型用作键和值,但出于某种原因,我在插入时会出现访问冲突。

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,如果这完全相关的话。

关于为什么会发生这种情况的任何想法?

谢谢!

1 个答案:

答案 0 :(得分:0)

对于那些好奇的人:问题是在应用程序的其他地方,在SomeClass实例上调用了一个memset来初始化内存。

是什么让这个问题困扰(在注意到memset之前):地图成员是常规实例成员(而不是指针),导致非常奇怪的结果,其中Map成员显然存在但处于不良状态。 / p>

感谢这些评论,我想到尝试将SomeClass地图成员改为指针(例如CMap * mfcMapAddress)。瞧,即使在我的构造函数创建CMap实例后,指针值也会被擦除为零。

谢谢!