本文主要是介绍关于std::shared_ptr和enable_share_from_this的一个隐蔽的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在使用共享指针时,遇到了一个如下问题:
#include <iostream>class traversal;class observer
{std::shared_ptr<traversal> m_tra;public:observer(std::shared_ptr<traversal> t):m_tra(t) {};~observer() { std::cout << "release observer" << std::endl; };void cb();
};class traversal
{
public:void fail(std::shared_ptr<observer> o);traversal() {};~traversal() { std::cout << "release traversal" << std::endl; };
};void observer::cb()
{m_tra->fail(std::shared_ptr<observer> this);return;
}void traversal::fail(std::shared_ptr<observer> o)
{return;
}int main()
{std::shared_ptr<traversal> t = std::make_shared<traversal>();std::shared_ptr<observer> ob = std::make_shared<observer>(t);ob->cb();}
这段代码会报错,原因在于cb()中调用了fail(),而fail()返回时会析构局部变量指针o,导致了ob的异常析构,从而使代码出错。为了解决该问题,这里不能使用this指针,而是应该使用shared_from_this来完成,代码如下:
#include <iostream>class traversal;class observer : public std::enable_shared_from_this<observer>
{std::shared_ptr<traversal> m_tra;public:observer(std::shared_ptr<traversal> t):m_tra(t) {};~observer() { std::cout << "release observer" << std::endl; };std::shared_ptr<observer> self() { return shared_from_this(); };void cb();
};class traversal
{
public:void fail(std::shared_ptr<observer> o);traversal() {};~traversal() { std::cout << "release traversal" << std::endl; };
};void observer::cb()
{m_tra->fail(self());return;
}void traversal::fail(std::shared_ptr<observer> o)
{return;
}int main()
{std::shared_ptr<traversal> t = std::make_shared<traversal>();std::shared_ptr<observer> ob = std::make_shared<observer>(t);ob->cb();}
这篇关于关于std::shared_ptr和enable_share_from_this的一个隐蔽的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!