解引用时返回空的shared_ptr时不一致

时间:2012-09-12 12:52:43

标签: c++ null return-value shared-ptr dereference

我最近注意到使用返回的空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 ......

2 个答案:

答案 0 :(得分:3)

两种情况下的代码都取消引用空指针。行为是未定义的,所以任何事情都可能发生,包括似乎有意义的事情。不要试图理解它们。未定义未定义。

答案 1 :(得分:1)

这些示例都没有真正起作用,因为它们使用空指针。

在第一种情况下,你真的不能从A访问任何东西,所以你可能不会注意到。在第二种情况下,访问i成员极有可能必须取消引用this指针(并且系统会注意到它为空)。