将此指针弱传递给其自己的函数

Pass weak this pointer to its own function

本文关键字:自己的 函数 指针      更新时间:2023-10-16

拥有这样的代码是个好主意吗:有什么陷阱吗?使用共享此指针是更好的设计吗?

class X { 
   public:
   void foo();
   void bar2(const boost::weak_ptr<X>& x); 
};
void X::foo() {}
void X::bar2(const boost::weak_ptr<X>& x) {}
void foo() 
{
    const boost::shared_ptr<X> x = boost::make_shared<X>();
    boost::weak_ptr<X> weakX(x);
    x->bar2(weakX);
}
int 
main()
{
    foo();
    return 0;
}

如果传递给函数的参数应该始终是这个weak_ptr版本,你就有问题了。代码中没有任何强制实施此行为的内容,因此类的用户可以轻松地将weak_ptr传递给另一个class X对象。

如果您需要的是bar2能够将shared_ptr传递给this,更好的解决方案是使用std::enable_shared_from_this

#include <iostream>
#include <memory>
struct Foo : public std::enable_shared_from_this<Foo> {
    Foo() { std::cout << "Foo::Foon"; }
    ~Foo() { std::cout << "Foo::~Foon"; } 
    std::shared_ptr<Foo> getFoo() { return shared_from_this(); }
};
int main() {
    Foo *f = new Foo;
    std::shared_ptr<Foo> pf1;
    {
        std::shared_ptr<Foo> pf2(f);
        pf1 = pf2->getFoo();  // shares ownership of object with pf2
    }
    std::cout << "pf2 is gonen";   
}

输出:

Foo::Foo
pf2 is gone
Foo::~Foo

与 http://en.cppreference.com/w/cpp/memory/enable_shared_from_this/shared_from_this 相比