• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

boost::asio(2):shared

mysql 搞代码 4年前 (2022-01-09) 18次浏览 已收录 0个评论

这就得从智能指针说起,智能指针就是利用一个变量的构造和析构函数来动态管理一个指针。 说白了就是:构造–new;析构–delete 我们可以很容易写一个智能指针: template class Tclass TAutoPtr{public: TAutoPtr() { m_t = new T(); cout TAutoPtr::TAutoPt

这就得从智能指针说起,智能指针就是利用一个变量的构造和析构函数来动态管理一个指针。

说白了就是:构造–>new;析构–>delete

我们可以很容易写一个智能指针:

template class TAutoPtr{public:    TAutoPtr() {        m_t = new T();        cout << "TAutoPtr::TAutoPtr()" << endl;    }    ~TAutoPtr() {        delete m_t;        cout << "TAutoPtr::~TAutoPtr()" << endl;    }private:    T*  m_t;};

使用:

int main(int argc, char** argv){    TAutoPtr tt;        return 0;}

这没有问题,很OK。

boost::asio就提供了该方法,可以迅速让shared_ptr来管理你的类。

但是这样就导致了一个问题,当你的类派生之enable_shared_from_this的时候,无法在类成员函数里面使用shared_from_this()获取类指针。

如下的用法是错误:

class B { publi<b style="color:transparent">来&源gao@dai!ma.com搞$代^码%网</b>c:     B(): x_(4) {         cout << "B::B()" << endl;     }     ~B() {         cout << "B::~B()" << endl;     }     void f() {         shared_ptr<B> p(this);         cout <x_ << endl;     } private:     int x_; }; int main(int argc, char** argv) {     shared_ptr<B> x(new B);     x->f();     return 0; } 

输出为:

B::B()
4
B::~B()
B::~B()

两次析构同一个对象,发生灾难性后果。

同样,如下的用法也是错误的:

class A : public enable_shared_from_this { public:     A() {         cout << "A::A()" << endl;     }     ~A() {         cout << "A::~A()" << endl;     }     void f() {         //cout <x_ << endl; // this way is okay too        shared_from_this();        //shared_ptr p = shared_from_this();        //cout <x_ <f();        return 0;}

虽然我们已经将类A派生之enable_shared_from_this,但是我们使用的时候并没有用shared_ptr包装类A。也错误。

总结如下:

1. 将该类派生之enable_shared_from_this。例如:class A : public enable_shared_from_this

2. 使用的时候必须加上shared_ptr abc(new A())


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:boost::asio(2):shared

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址