키 및 값으로 메모리 주소 또는 포인터 형식을 사용하려고하지만 어떤 이유로 삽입시 액세스 위반이 발생합니다.포인터/주소를 키 및 값으로 사용하면 액세스 위반이 CMap 또는 std :: map
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과 관련이 있습니다.
왜 이런 일이 벌어 질 수 있는지에 대한 아이디어가 있습니까?
감사합니다.
어디에서 어떻게 m_someClassRef를 설정합니까? 내 추측은 그것이 null이라는 것이다. –
별로 쉽지 않은데 두려워! 내 실제 디버깅 코드에서는 삽입을 수행하기 전에 실제로 맵의 크기를 얻습니다 (물론 모두 0입니다). 하나의 흥미로운 결과는 CMap이 완전히 초기화되지 않은 것처럼 보이므로 의도적으로 InitHashTable (, true)을 호출해야합니다. 내가이 일을하지 않으면, 제로 크래시에 의한 격차가 생깁니다. –
John
게시 된 코드에 문제가 없습니다 (적어도 충돌을 일으킬만한 것은 없습니다). 버그가 다른 곳에서 코드를 게시합니다. – john