zoukankan      html  css  js  c++  java
  • 智能指针share_ptr记录

    shared_ptr 是一个共享所有权的智能指针,允许多个指针指向同一个对象。shared_ptr 对象除了包括一个对象的指针,还包括一个引用计数器。当每给对象分配一个share_ptr的时候,引用计数加一;每reset一个share_ptr, 或者修改对象的指向(指向其他对象或者赋值nullptr),或者局部share_ptr离开作用域,引用计数减一,当引用计数为0的时候,自动释放自己所管理的对象。

    构造:

          struct C {int* data;};
        std::shared_ptr<int> p1;
        std::shared_ptr<int> p2 (nullptr);
        std::shared_ptr<int> p3 (new int);
        std::shared_ptr<int> p4 (new int, std::default_delete<int>());
        std::shared_ptr<int> p5 (new int, [](int* p){delete p;}, std::allocator<int>());
        std::shared_ptr<int> p6 (p5);
        std::shared_ptr<int> p7 (std::move(p6));
        std::shared_ptr<int> p8 (std::unique_ptr<int>(new int));
        std::shared_ptr<C> obj (new C);
        std::shared_ptr<int> p9 (obj, obj->data);

    输出引用计数:

    拷贝和转移:

    std::shared_ptr<int> foo;
    std::shared_ptr<int> bar(new int(10));
    foo = bar; // copy
    bar = std::make_shared<int>(20); // move
    std::unique_ptr<int> unique(new int(30));
    foo = std::move(unique); // move from unique_ptr
    std::cout << "*foo: " << *foo << '
    ';
    std::cout << "*bar: " << *bar << '
    ';

    输出:

    交换控制权:

    std::shared_ptr<int> foo(new int(10));
    std::shared_ptr<int> bar(new int(20));
    foo.swap(bar);
    std::cout << "*foo: " << *foo << '
    ';
    std::cout << "*bar: " << *bar << '
    ';

    输出:

    重置:

    std::shared_ptr<int> sp;
    sp.reset(new int);
    *sp = 10;
    std::cout << *sp << '
    ';
    sp.reset(new int);
    *sp = 20;
    std::cout << *sp << '
    ';
    sp.reset();

    输出:

    判断是否是唯一的share_ptr

    std::shared_ptr<int> foo;
    std::shared_ptr<int> bar(new int);
    std::cout << "1: " << foo.unique() << '
    '; // false (empty)
    foo = bar;
    std::cout << "2: " << foo.unique() << '
    '; // false (shared with bar)
    bar = nullptr;
    std::cout << "3: " << foo.unique() << '
    '; // true

    输出:

  • 相关阅读:
    C# git .gitignore文件
    Python常用库
    STM32移植LWIP之客户端与服务端的数据传输
    linux_cam_test文件
    DEBUG调试文件
    Linux多线程总结
    Git add命令
    Git使用总结
    C语言中可变参数的使用
    Hi3518EV300编译U-Boot和内核报错:loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed. Aborted (core dumped)
  • 原文地址:https://www.cnblogs.com/tyche116/p/12082533.html
Copyright © 2011-2022 走看看