0

我正在尝试使用内存地址或指针类型作为键和值,但由于某种原因,我在插入时遇到访问冲突。

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。

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

谢谢!

4

1 回答 1

0

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

是什么让这个问题令人困扰(在注意到 memset 之前):map 成员是常规实例成员(而不是指针),导致 Map 成员明显存在但处于错误状态的非常奇怪的结果。

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

谢谢!

于 2012-11-15T01:20:11.680 回答