我最近注意到使用返回的空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 ......
答案 0 :(得分:3)
两种情况下的代码都取消引用空指针。行为是未定义的,所以任何事情都可能发生,包括似乎有意义的事情。不要试图理解它们。未定义未定义。
答案 1 :(得分:1)
这些示例都没有真正起作用,因为它们使用空指针。
在第一种情况下,你真的不能从A访问任何东西,所以你可能不会注意到。在第二种情况下,访问i
成员极有可能必须取消引用this
指针(并且系统会注意到它为空)。