2016-08-10 2 views
3

malloc 또는 free을 신호 처리기에서 직접 또는 간접적으로 호출하는 것이 안전하지 않다는 것을 알고 있습니다.시그널 핸들러에서`std :: shared_ptr`와`std :: weak_ptr`을 사용하는 것이 안전합니까?

그러나 적어도 하나의 공유 참조가 살아남을 것이라고 보장 할 수 있다면 추가 공유 또는 약한 참조를 복사하고 생성하거나 삭제하는 것이 안전할까요? 아니면 자체 계산을 롤백해야합니까?

은 (예, 보통 많이하지 말아야 할 신호 처리기를 알고 있지만 나는 좋은 이유는이 시간이..) 다음과 같이

답변

6

C++ 표준은 "평범한 오래된 기능"의 개념을 정의한다 :

POF ("일반 이전 기능")는 [C/C++] 공통 하위 집합의 기능 만 사용하고 POF가 아닌 다른 기능을 직접 또는 간접적으로 사용하지 않는 기능입니다 일반 잠금없는 원자 작업을 사용할 수 있습니다. 또한

:

는 C++ 프로그램 신호 처리기로서 이용 POF 이외 함수의 동작하는 구현 정의된다.

분명히 C++ 클래스 객체는 C/C++ 공통 하위 집합의 일부가 아니므로 신호 처리기에서이를 사용하면 구현 정의 동작을 얻을 수 있습니다.

이제 많은 구현에서 제한된 C++ 기능 사용을 허용합니다. 구현시 메모리 할당이나 예외를 허용하지 않으면 스마트 포인터 유형에 대해 알고있는 것입니다.

모든 weak_ptr constructors은 명시 적으로 noexcept으로 선언됩니다. 그래서 그들은 예외를 던질 수 없습니다. 이것은 또한 메모리를 할당하지 못하면 예외가 발생하기 때문에 메모리를 할당 할 수 없다는 것을 의미합니다. 예, 그들은 메모리를 할당 할 수 있고 실패 할 경우 std::terminate을 구현할 수 있습니다.

copy&move constructors of shared_ptr도 마찬가지로 noexcept이므로 동일하게 적용됩니다. shared_ptr의 별칭 생성자에도 해당됩니다.

당신이 적어도 하나의 shared_ptr가 여전히 존재 것이다하는 shared_ptr 명시 적으로 언급되어 다음 파괴하는 부작용이없는 확신 을 경우. 아마도 메모리 할당 해제가 포함됩니다.

표준 라이브러리에서 제공하는 보증 사항입니다.