【问题标题】:Pass weak this pointer to its own function将弱 this 指针传递给它自己的函数
【发布时间】:2015-06-15 18:36:53
【问题描述】:

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

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;
}

【问题讨论】:

  • 代码正确(可能有设计问题,未透露)
  • 明显的缺陷是这个指针是一个常规指针,因此您可能会遇到在成员函数运行时对象被破坏的情况,请小心。您可能想看看 std::/boost:: enable_shared_from_this。同样的陷阱。

标签: c++ this weak-ptr


【解决方案1】:

如果传递给函数的参数应该始终是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::Foo\n"; }
    ~Foo() { std::cout << "Foo::~Foo\n"; } 
    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 gone\n";   
}

输出:

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

来自http://en.cppreference.com/w/cpp/memory/enable_shared_from_this/shared_from_this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多