3

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

4

2 回答 2

3

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

于 2012-09-12T12:58:17.240 回答
1

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

在第一种情况下,您实际上没有从 A 访问任何内容,因此您可能不会注意到。在第二种情况下,访问i成员很可能必须取消引用this指针(系统会注意到它为空)。

于 2012-09-12T12:59:37.567 回答