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

どちらの場合も、コードはnullポインターを逆参照します。動作は定義されていないため、意味があると思われることも含めて、何でも起こり得ます。それらを理解しようとしないでください。未定義は未定義です。

于 2012-09-12T12:58:17.240 に答える
1

ヌルポインタを使用しているため、どの例も実際には機能しません。

最初のケースでは、実際にはAから何にもアクセスしないため、気付かない可能性があります。2番目のケースでは、メンバーにアクセスするためにポインターiを逆参照する必要がある可能性が非常に高くなりthisます(そして、システムはポインターがnullであることを認識します)。

于 2012-09-12T12:59:37.567 に答える