물체가 스스로 던질 수 있습니까?

니 코스 아타나시오 우

예외에 대한 최근 질문에 대답하면서 이전 쿼리가 떠 올랐습니다.

다음은 C ++로 컴파일됩니다.

#include <iostream>
using namespace std;

struct weird {
    void danger()
    {
        throw *this;
    }
};

int main() 
{
    weird object;
    object.danger();
    return 0;
}

그러나 항상 런타임 오류가 발생합니다.

  • 스택을 푸는 동안 객체가 던져지고 보존되지 않습니까?

  • 런타임 오류는에 대한 호출 냄새가납니다 terminate. 어떻게 발생합니까?

  • weird object둘러싸는 범위 (여기서 전역)에서 선언 된 경우 내부 범위에서 작동 할 수 있습니까? (그 스택을 풀어도 우수한 스택에는 영향을 미치지 않습니까?)

bames53

결과는 std::terminate()예외가 포착되지 않았기 때문에에 대한 호출 입니다. 다음으로 변경하면 제대로 작동합니다.

int main() {
    weird object;
    try {
      object.danger();
    }
    catch (weird &w) {
      std::cout << "caught weird\n";   
    }
}
  • 스택을 푸는 동안 객체가 던져지고 보존되지 않습니까?

예외가 발생하면 예외 발생 메커니즘이 발생 된 값의 복사본을 어딘가의 개인 메모리에 복사하므로 'thrown'개체의 수명은 중요하지 않습니다.

(물론 포인터를 던지면 포인터 값이 유지되고 가리키는 객체가 아닙니다.이 경우 객체가 여전히 존재하는지 확인하여 catch 핸들러가 포인터 값으로 잘못된 작업을 수행하지 않도록해야합니다. catch 핸들러는 포인터를 따르지 않습니다.)

  • 런타임 오류는에 대한 호출 냄새가납니다 terminate. 어떻게 발생합니까?

예외가 발생하고 std::terminate()호출해야하는 해당 catch 핸들러 C ++ 상태가없는 경우 . 적절한 catch 핸들러를 찾는 예외 발생 메커니즘은 적절한 catch 핸들러 std::terminate()를 찾지 못할 때 호출 하여이를 구현 합니다.

  • weird object둘러싸는 범위 (여기서 전역)에서 선언 된 경우 내부 범위에서 작동 할 수 있습니까?

글로벌이든 아니든 상관 없습니다. 예외를 던지는 동작은 (대부분) 어느 쪽이든 잘 정의되어 있습니다.

(지정된 구현 중 하나는 std::terminate()catch 핸들러를 찾을 수 없을 때 스택이 풀리기 전에 호출되는 경우입니다. 대부분의 구현에서 스택이 풀리지 않는다고 생각합니다.)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

사용할 때 던질 임의의 개체 인스턴스를 패치 할 수 있습니까?

분류에서Dev

던질 수있는 것을 Completable의 다음 체인으로 어떻게 전파 할 수 있습니까?

분류에서Dev

pytest가 실패시 stderr을 던질 수 있습니까?

분류에서Dev

Java Bean으로 예외를 던질 수 있습니까?

분류에서Dev

std :: accumulate 던질 수 있습니까?

분류에서Dev

Future가 호출자가 잡은 예외를 던질 수 있습니까?

분류에서Dev

이 인터페이스는 속성으로 이미 인스턴스화 객체를 가질 수 있습니까?

분류에서Dev

Try를 반환하는 메소드가 던질 수 있습니까?

분류에서Dev

std :: exception_ptr 복사 생성자가 던질 수 있습니까?

분류에서Dev

Windows 핫스팟으로 로그인 페이지를 가질 수 있습니까?

분류에서Dev

"싱글 톤"emacs 인스턴스를 가질 수 있습니까?

분류에서Dev

R의 객체가 둘 이상의 클래스를 가질 수 있습니까?

분류에서Dev

Ubuntu에서 Flashgot으로 다중 스레드 cURL을 가질 수 있습니까?

분류에서Dev

Django에서 모델 필드로 클래스를 가질 수 있습니까?

분류에서Dev

영숫자로 된 클래스 이름을 가질 수 있습니까?

분류에서Dev

btrfs에 스왑 파일을 가질 수 있습니까?

분류에서Dev

시퀀스는 동의어를 가질 수 있습니까?

분류에서Dev

btrfs에 스왑 파일을 가질 수 있습니까?

분류에서Dev

클래스 확장 번호를 가질 수 있습니까?

분류에서Dev

클래스 확장 번호를 가질 수 있습니까?

분류에서Dev

EditTextPreference에 리스너를 가질 수 있습니까?

분류에서Dev

UISpringTimingParameters는 역 스프링 효과를 가질 수 있습니까?

분류에서Dev

JAX-WS 및 SOAP를 사용하여 체인 예외를 던질 수 있습니까?

분류에서Dev

JAX-WS 및 SOAP를 사용하여 체인 예외를 던질 수 있습니까?

분류에서Dev

내가 만약 hystrix 보호 통화 시간에서 사용자 지정 오류를 던질 수 있습니까?

분류에서Dev

처리가 응답하지 않으면 어떻게 예외를 던질 수 있습니까?

분류에서Dev

안드로이드는 MD5에 대해 NoSuchAlgorithmException을 던질 수 있습니까?

분류에서Dev

문자열에서 int로 캐스팅하면 정밀도 손실이 발생할 때 어떻게 예외를 던질 수 있습니까?

분류에서Dev

C ++ 람다 표현식이 던질 수 있습니까?

Related 관련 기사

  1. 1

    사용할 때 던질 임의의 개체 인스턴스를 패치 할 수 있습니까?

  2. 2

    던질 수있는 것을 Completable의 다음 체인으로 어떻게 전파 할 수 있습니까?

  3. 3

    pytest가 실패시 stderr을 던질 수 있습니까?

  4. 4

    Java Bean으로 예외를 던질 수 있습니까?

  5. 5

    std :: accumulate 던질 수 있습니까?

  6. 6

    Future가 호출자가 잡은 예외를 던질 수 있습니까?

  7. 7

    이 인터페이스는 속성으로 이미 인스턴스화 객체를 가질 수 있습니까?

  8. 8

    Try를 반환하는 메소드가 던질 수 있습니까?

  9. 9

    std :: exception_ptr 복사 생성자가 던질 수 있습니까?

  10. 10

    Windows 핫스팟으로 로그인 페이지를 가질 수 있습니까?

  11. 11

    "싱글 톤"emacs 인스턴스를 가질 수 있습니까?

  12. 12

    R의 객체가 둘 이상의 클래스를 가질 수 있습니까?

  13. 13

    Ubuntu에서 Flashgot으로 다중 스레드 cURL을 가질 수 있습니까?

  14. 14

    Django에서 모델 필드로 클래스를 가질 수 있습니까?

  15. 15

    영숫자로 된 클래스 이름을 가질 수 있습니까?

  16. 16

    btrfs에 스왑 파일을 가질 수 있습니까?

  17. 17

    시퀀스는 동의어를 가질 수 있습니까?

  18. 18

    btrfs에 스왑 파일을 가질 수 있습니까?

  19. 19

    클래스 확장 번호를 가질 수 있습니까?

  20. 20

    클래스 확장 번호를 가질 수 있습니까?

  21. 21

    EditTextPreference에 리스너를 가질 수 있습니까?

  22. 22

    UISpringTimingParameters는 역 스프링 효과를 가질 수 있습니까?

  23. 23

    JAX-WS 및 SOAP를 사용하여 체인 예외를 던질 수 있습니까?

  24. 24

    JAX-WS 및 SOAP를 사용하여 체인 예외를 던질 수 있습니까?

  25. 25

    내가 만약 hystrix 보호 통화 시간에서 사용자 지정 오류를 던질 수 있습니까?

  26. 26

    처리가 응답하지 않으면 어떻게 예외를 던질 수 있습니까?

  27. 27

    안드로이드는 MD5에 대해 NoSuchAlgorithmException을 던질 수 있습니까?

  28. 28

    문자열에서 int로 캐스팅하면 정밀도 손실이 발생할 때 어떻게 예외를 던질 수 있습니까?

  29. 29

    C ++ 람다 표현식이 던질 수 있습니까?

뜨겁다태그

보관