문제

Linux C++ 응용 프로그램이 있고 이를 역참조하기 전에 개체 포인터의 유효성을 테스트하고 싶습니다.그러나 분할 오류로 인해 Linux에서는 try/catch가 작동하지 않습니다.어떻게 할 수 있나요?

도움이 되었습니까?

해결책

앱 전체의 많은 포인터가 동일한 제한된 제한된 객체를 참조하는 시나리오가있는 경우 인기있는 솔루션은 사용하는 것입니다. 스마트 포인터를 향상시킵니다. 편집 : C ++ 11 에서이 두 유형은 표준 라이브러리에서 사용할 수 있습니다.

당신은 사용하고 싶을 것입니다 shared_ptr 물체의 수명을 담당하는 포인터 (들)의 경우 weak_ptr 다른 포인터의 경우 유효하지 않을 수 있습니다. 당신은 그것을 볼 것입니다 weak_ptr 내장을 요구하는 유효성 검사가 있습니다.

다른 팁

세분화 오류는 예외가 아닙니다 (Java의 NullPointerException과 같은). OS에서 프로세스로 전송 된 신호입니다. 살펴보십시오 SIGACTION의 인공 SIGSEGV (Segmentation Fault) 용 핸들러를 설치하는 방법에 대한 포인터.

포인터를 null로 초기화하십시오. 일부 처리 후에도 여전히 무효가되면 유효하지 않습니다. 그렇지 않으면 유효합니다.

이 사건에 대해 SIGSEGV 용 신호 처리기를 활성화 할 수 있습니다. 자세한 내용은 Man Page "Signal"을 참조하십시오. 다른 대안은 유효한 참조를 사용하는 것입니다. 물론 귀하의 신청에 따라 다릅니다.

원시 C++ 포인터에는 자연스럽고 보편적인 방법이 없습니다.C++에서는 해당 정보를 추적한다고 가정합니다.

대부분의 상황에서는 포인터가 유효하지 않은 경우 포인터를 NULL로 설정하는 것을 기억하여 이를 처리할 수 있습니다.처음에 가리키지 않는 새 포인터는 NULL로 설정되어야 하며 새로 삭제된 개체의 포인터는 NULL로 설정되어야 합니다.

유효성에 대한 포인터를 어떻게 테스트합니까? null과 비교해?

당신이하는 가장 좋은 일은 프로그램을 실행하는 것입니다. Valgrind. 버그는 상당히 다른 곳에있을 수 있습니다.

업데이트 : Win32 플랫폼에는 __try __excrect와 같은 것이 있습니다. 그 Win32 기능에 동등한 Linux가 없다는 것을 알고 있습니다.

SIGSEGV에 핸들러를 첨부하면 오류가 발생했다는 사실을 기록하고 우아하게 실패 할 수있는 일이 많지 않습니다. 귀하의 프로그램은이 위반이 발생할 때 정의되지 않은 상태이므로 정상적인 운영을 계속하는 것이 안전하지 않을 수 있습니다.

NULL을 확인하는 것 외에도, 나는 당신이 설명하는 의미에서 포인터가 '유효한 지 확인하는 방법이 있다고 생각하지 않습니다. 이와 같은 정상적인 작동 오류는 버그를 나타내므로 발생하지 않아야하므로 우아하지만 프로그램이 실패해야합니다.

포인터는 물체에 저장됩니다. 그것들은 생성자에서 잠재적으로 0 (null)으로 초기화됩니다. 그들은 소멸자, 아마도 과제에서 그리고 다른 기능에서는 거의 삭제되었습니다. 소멸자 이외의 멤버에서 삭제되면 즉시 새 값 또는 0이 할당됩니다.

일반적으로 "유효성에 대한 비 널 포인터 확인"이라는 꽤 이상한 아이디어와 관련 하여이 기사를 살펴보십시오. http://blogs.msdn.com/oldnewthing/archive/2006/09/27/773741.aspx ( "ISBADXXXPTR은 실제로 CrashProgramRandomly라고 불러야합니다")

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