programing

포인터가 유효한지 확인하는 방법은?

sourcejob 2023. 10. 1. 19:25
반응형

포인터가 유효한지 확인하는 방법은?

이 질문의 추함을 잘 알고 있습니다. 그래도 가능한지 알고 싶습니다.

프로그램이 잘못된 포인터(NULL, 할당되지 않은 블록 등)에 읽기/쓰기를 시도하면 창에서 액세스 위반 예외와 함께 응용 프로그램이 충돌합니다.

문제는 이 포인터가 사용을 시도하기 전에 예외를 생성하는지 확인할 수 있는 방법이 있는가 하는 것입니다. 아니면 이 예외를 포착할 수 있는 방법이 있는가 하는 것입니다.

원시 포인터를 사용해야 하는 경우 가장 좋은 방법은 올바른 포인터인지 NULL인지 확인하는 것입니다.그런 다음 NULL과 같은지 확인하여 유효한지 확인할 수 있습니다.

그러나 질문에 답하기 위해 구조화된 예외 처리(SEH)로 이러한 종류의 것을 잡을 수 있습니다.

그렇기는 하지만 SEH는 좋지 않은 생각입니다.

이러한 오류를 파악하는 것은 근본 원인이 아니라 증상을 해결하는 것입니다.

다음 관용구는 모든 플랫폼에서 사용할 수 있습니다.

  • 모든 포인터를 0으로 초기화

  • 포인터가 유효한지 확인할 수 없는 경우, 포인터를 간접하기 전에 0이 아님을 확인합니다.

  • 개체 삭제 시 삭제 후 포인터를 0으로 설정합니다.

  • 다른 함수에 포인터를 전달할 때 개체 소유권 문제를 주의해야 합니다.

기능이 있습니다.IsBadReadPtr그리고.IsBadWritePtr당신이 원하는 대로 할 수도 있습니다.그것들을 사용해서는 안 되는 이유를 설명하는 기사도 있습니다.

포인터가 NULL인지 확실히 테스트할 수 있습니다!

if ( ptr == NULL ) {
   // don't use it
}

그것이 당신이 할 수 있는 유일한 휴대용 테스트입니다.윈도우는 포인터를 테스트하기 위한 다양한 API를 제공하지만, 다른 사람들이 지적했듯이 포인터를 사용하는 것은 문제가 될 수 있습니다.

IsBadReadPointer / IsBadWritePointer

IsBadReadPtr 같은 것을 찾으시는 것 같습니다.

설명서:

http://msdn.microsoft.com/en-us/library/aa366713(VS.85).aspx

Windows에 대해서는 모르지만 *nix에서는 SIGSEGV 신호 처리기를 설치하여 예외를 차단할 수 있습니다.

언급URL : https://stackoverflow.com/questions/993324/how-to-check-if-a-pointer-is-valid

반응형