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 メンバーが明らかに存在するにもかかわらず、悪い状態のままになる非常に奇妙な結果につながります。

コメントのおかげで、代わりに SomeClass マップ メンバーをポインターに変更しようと思いつきました (例: CMap* mfcMapAddress)。私のコンストラクターが CMap インスタンスを作成した後でも、ポインター値はゼロに消去されます。

ありがとうございました!

于 2012-11-15T01:20:11.680 に答える