문제

포인터를 Long으로 변환해야하며 (sendMessage ()). 그리고 다른 사람에서 변수가 올바른지 안전하게 확인하고 싶습니다. 그래서 나는 dynamic_cast를하고 있다고 생각했지만 가상이 아닌 클래스에서는 작동하지 않습니다. 그런 다음 TypeID를 수행 할 생각이지만 파생 된 VAR을 기본으로 통과 할 때까지 작동합니다.

포인터가 런타임 중에 기대하는 것인지 확인하는 방법이 있습니까? 포인터가 특정베이스에서 파생 된 유형인지 확인하기 위해 TypeID를 사용할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

당신이 가진 것이 있다면 long, 당신이 할 수있는 일은 많지 않습니다. 임의의 숫자가 유효한 메모리 주소를 나타내는 지 여부를 결정하는 일반적인 방법은 없습니다. 그리고 그것이 유효한 메모리 주소라는 것을 알고 있더라도 포인터가 가리키는 것의 유형을 결정할 방법이 없습니다. 주소가 캐스트되기 전에 실제 유형의 물건을 확신 할 수 없다면 long, 당신은 캐스팅하는 것이 안전 할 것이라고 확신 할 수 없습니다. long 캐스팅하려는 모든 유형에.

메시지 발송자가 귀하에게 유효한 값을 보냈다는 것을 믿어야합니다. 당신이 할 수있는 최선은 가짜 가치를받을 때 자신의 프로그램의 결과를 줄이기 위해 몇 가지 예방 조치를 취하는 것입니다.

다른 팁

당신의 참조 SendMessage() MS Windows가 당신의 플랫폼 인 것처럼 들립니다. 포인터 사용 규칙 (Windows) 독서가 권장됩니다. 자세히 설명합니다 PtrToLong 그리고 PtrToUlong Microsoft가 이와 같은 상황에서 제공하는 기능 및 기타 사항.

typeid를 사용할 수 없습니다. 유효한 포인터 대신 쓰레기를 받으면 액세스 위반이 발생하므로 수표는 무의미합니다.

해야 할 일은 SendMessage와 메시지를 단일 유형 안전 인터페이스로 처리하는 코드를 랩핑하는 것입니다. 이렇게하면 예기치 않은 물건을 보내기 위해 전달할 수 없으며 수신 측에 대한 수표가 필요하지 않습니다.

C ++ 유형 시스템은 컴파일 시간에 작동합니다. 포인터를 길게 시전하면 모든 유형의 정보가 느슨해집니다. 길은 기억에 너무 많은 비트입니다. 객체를 가리키고 있음을 식별 할 수있는 방법은 없습니다.

ptlib ( http://sourceforge.net/projects/opalvoip/ )는 pclassinfo 매크로를 사용하여 클래스 간의 관계를 정의합니다. 이것은 isdescendant 및 getclass와 같은 기능을 제공합니다.

아마도 비슷한 것을 구현할 수 있습니다.

Dynamic_cast는 가상 메소드 테이블의 서명을 확인하여 작동합니다. 가상 방법이 없다면 VMT가 없으므로 Dynamic_cast가 작동하지 않습니다. 그러나 VMT가없는 경우 가리키는 물체에 대한 지식이 전혀 없습니다.

가장 좋은 방법은 포인터가 더미 인 경우에도 적어도 하나의 가상 메소드를 가진 클래스에 필요한 것입니다. 그러면 다이나믹 캐스트가 작동합니다.

나는 당신의 질문이 무엇인지 아직 이해하지 못합니다.

  • 그것이 길고 뒤로 캐스팅하는 것이 동일한 값을 산출 할 수 있는지 확인할 수 있는지 여부를보십시오. 변수의 유형을 안전하게 확인합니다
    "포인터 사용 규칙"이 주어지면 다른 응답자가 연결 한 MS-Site, CAST에 적합한 유형은 IS입니다. UINT_PTR. 그래서 당신은합니다 UINT_PTR v = reinterpret_cast<UINT_PTR>(ptr); 통합 유형으로 캐스트하고 리버스를 수행하여 다시 포인터로 다시 캐스트합니다. C ++ 표준은 원래 값이 복원되도록 보장합니다. (내 설명에 대해 위의 링크를 참조하십시오). 그건 그렇고 Microsoft 사이트는 또한 WPARAM과 LPARAM이 플랫폼에 따라 크기를 변경한다고 말합니다. 따라서 해당 변수 만 사용할 수 있습니다 v 그리고 SendMessage 그것.
  • 포인터 (일부 포인터 유형으로 변환)가 어떤 객체를 가리키든 상대방을 확인할 수있는 방법이라면 대답은 다음과 같습니다. 당신은 할 수 없습니다. 어떤 포인터 유형을 보내는 데 사용되었는지는 확실하지 않기 때문에 수신 측면에서 포인터가 지적한 동적 유형을 확인할 수 없습니다. 포인터가 발신자쪽에있는 유형을 알고 있다면, 처음에는 수표가 필요하지 않습니다.

Windows에서 MFC는 주어진 포인터가 유효한 메모리 위치를 가리키는 지 확인하는 메소드를 제공합니다 (SEGFAULT를 포획하여 수행). 나는 함수 이름을 기억하지 못하지만 거기에 있습니다. 그럼에도 불구하고 지적 된 메모리의 내용이 유효하다는 것을 보장하지는 않습니다. 여전히 유효하지 않은 VMT가 있었고 코드가 충돌 할 수 있습니다. 물론, 당신은 segfault를 직접 덫을 놓을 수 있습니다 (MS 지식 기반을 참조하십시오)

무언가가 유형에 속하는지 확인하려면 기본 클래스가 있어야합니다. 기본 클래스의 "가상"의 소멸자를 만들면 모든 파생 클래스에는 VMT가 있습니다.

모든 비용으로 VMT를 피해야하는 경우 MS Windows 이벤트의 이벤트 유형과 같이 다루는 내용을 알려주는 일종의 탈 스크리 미네이터가 있어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top