代码之家  ›  专栏  ›  技术社区  ›  Ryan Emerle

您应该如何返回带有共享\u ptr的*此文件?

  •  6
  • Ryan Emerle  · 技术社区  · 17 年前

    Similar question

    下面的代码显然是危险的。问题是:您如何跟踪对*this的引用?

    using namespace boost;
    
    // MyClass Definition
    class MyClass {
    
    public:
       shared_ptr< OtherClass > createOtherClass() {
          return shared_ptr< OtherClass > OtherClass( this ); // baaad
       }
       MyClass();
       ~MyClass();
    };
    
    // OtherClass Definition
    class OtherClass {
    
    public:
       OtherClass( const *MyClass myClass );
       ~OtherClass();
    };
    
    // Call; pMyClass refcount = 1
    shared_ptr< MyClass > pMyClass( new MyClass() );
    
    // Call; pMyClass refcount = 1 => dangerous
    pMyClass->createOtherClass();
    

    我有答案(贴在下面),我只希望它在stackoverflow上(如果我错了,每个人都可以纠正我)

    2 回复  |  直到 9 年前
        1
  •  7
  •   Ryan Emerle    17 年前

    关键是扩展 enable_shared_from_this<T> 并使用 shared_from_this() 方法将共享的\u ptr获取到 *this

    For detailed information

    using namespace boost;    
    
    // MyClass Definition
    class MyClass : public enable_shared_from_this< MyClass > {
    
    public:
       shared_ptr< OtherClass> createOtherClass() {
          return shared_ptr< OtherClass > OtherClass( shared_from_this() );
       }
       MyClass();
       ~MyClass();
    };
    
    // OtherClass Definition
    class OtherClass {
    
    public:
       OtherClass( shared_ptr< const MyClass > myClass );
       ~OtherClass();
    };
    
    // Call; pMyClass refcount = 1
    shared_ptr< MyClass > pMyClass( new MyClass() );
    
    // Call; pMyClass refcount = 2
    pMyClass->createOtherClass();
    
        2
  •  1
  •   Loki Astari    17 年前


    您的代码无法编译!!

    您的代码的设计方式无法阻止滥用/不正确使用:

    MyClass            x;
    SharedPtr<MyClass> y = x.createOtherClass();
    

    现在怎么办?