최근에 반환 된 빈 shared_ptr을 사용할 때 이상한 동작을 감지했습니다. 호출 다음dereferencing이 반환 될 때 불일치가 발생했습니다. empty shared_ptr
struct A {
A() { }
void foo() {
std::cout << "A::foo" << std::endl;
}
};
struct B {
B() :i(42) { }
void foo() {
std::cout << "B:foo with i: " << i << std::endl;
}
int i;
};
template<typename T>
std::shared_ptr<T> create_empty() {
return std::shared_ptr<T>();
}
: : 문제는이 예제를 고려 설명하기 위해
이std::shared_ptr<A> pa(create_empty<A>());
pa->foo(); // #1: Works fine and prints: "A::foo".
std::shared_ptr<B> pb(create_empty<B>());
pb->foo(); // #2: Throws an exception.
이제 내 질문은 왜 # 1 작품을 호출한다 (나뿐만 아니라 예외를 얻을 것으로 예상)이 올바른 경우 # 1의 작동을 막는 방법. 반환 값이 비어 있는지 확인해야합니까? 거기에 null 또는 빈 shared_ptr를 반환하는 다른 방법이 있습니까? 그게 중요하다면 MSVC++ 11을 사용하고 있습니다 ...
일반적으로 C++은 사용자가 명시 적으로 요청하지 않으면 값 비싼 검사를 추가하지 않습니다. 자신의 재량에 따라 코드에'if (pa)'를 추가하는 것은 전적으로 자유 롭습니다. –