您尚未登录。

楼主 #1 2017-09-08 21:39:40

cyxstrong
会员
注册时间: 2017-09-06
已发帖子: 5
积分: 5

智能指针shared_ptr的用法

shared_ptr是一个最像指针的"智能指针",是boost.smart_ptr库中最有价值、最重要的组成部分,也是最有用的,Boost库的许多组件--甚至还包括其他一些领域的智能指针都使用了shared_ptr。
shared_ptr的作用有如内指针,但会记录有多少个tr1::shared_ptrs共同指向一个对象。这便是所谓的引用计数(reference counting)。一旦最后一个这样的指针被销毁,也就是一旦某个对象的引用计数变为0,这个对象会被自动删除。

  1. shared_ptr的线程安全性
    shared_ptr 本身不是 100% 线程安全的。它的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档,shared_ptr 的线程安全级别和内建类型、标准库容器、string 一样,即:
    一个 shared_ptr 实体可被多个线程同时读取;
    两个的 shared_ptr 实体可以被两个线程同时写入,“析构”算写操作;
    如果要从多个线程读写同一个 shared_ptr 对象,那么需要加锁。

  2. shared_ptr用法
    #include <iostream>
    #include <tr1/memory>
    class Foo
    {
    public:
    void print()
    {
    std::cout << " foo::print" << std::endl;
    }
    };

int main()
{
std::tr1::shared_ptr<Foo> sp1(new Foo);
sp1->print();
std::cout << "sp1 pointer: " << sp1.get() << std::endl;
std::tr1::shared_ptr<Foo> sp2(sp1);
sp2->print();
std::cout << "sp1 pointer: " << sp1.get() << std::endl;
std::cout << "sp2 pointer: " << sp2.get() << std::endl;
std::cout << "counter sp1: " << sp1.use_count() << std::endl;
std::cout << "counter sp2: " << sp2.use_count() << std::endl;
return 0;
}
/
/* SP2创建后, SP1增加引用计数.

  • 指向的对象超出范围时,最后一个销毁的指针会释放资源
    *

  • 例子输出:

  • foo::print

  • sp1 pointer: 0x90a7008

  • foo::print

  • sp1 pointer: 0x90a7008

  • sp2 pointer: 0x90a7008

  • counter sp1: 2

  • counter sp2: 2
    */

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn


东莞哇酷科技有限公司开发