shared_ptr 与 unique_ptr

      区别:shared_ptr 和 unique_ptr 都提供了一种机制保证指针的释放,区别在于,shared_ptr所管理的对象可以多个shared_ptr共享管理权,当最后一个shared_ptr释放管理权的时候,对资源进行析构。unique_ptr保证一时刻,只有一个唯一有效的unique_ptr保持对资源的管理权。

shared_ptr 构造

#include<iostream>
#include<memory>

struct C {
    int* data;
};

int main (){
    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::cout << "use_count:\n";
    std::cout << "p1: " << p1.use_count() << '\n';
    std::cout << "p2: " << p2.use_count() << '\n';
    std::cout << "p3: " << p3.use_count() << '\n';
    std::cout << "p4: " << p4.use_count() << '\n';
    std::cout << "p5: " << p5.use_count() << '\n';
    std::cout << "p6: " << p6.use_count() << '\n';
    std::cout << "p5: " << p5.use_count() << '\n';
    std::cout << "p7: " << p7.use_count() << '\n';
    std::cout << "p6: " << p6.use_count() << '\n';
    std::cout << "p8: " << p8.use_count() << '\n';
    std::cout << "p9: " << p9.use_count() << '\n';
    return 0;
}

编译:g++ shared_ptr.cpp -std=c++11


shared_ptr::operator=

#include<iostream>
#include<memory>

#define PRINT_COUNT(ptr) \
    std::cout << #ptr" use_count: " << ptr.use_count() << '\n';

int main (){
    std::shared_ptr<int> foo;
    std::shared_ptr<int> bar(new int(10));
    PRINT_COUNT(foo)
    PRINT_COUNT(bar)

    foo = bar;
    PRINT_COUNT(foo)
    PRINT_COUNT(bar)

    bar = std::make_shared<int>(20);
    PRINT_COUNT(foo)
    PRINT_COUNT(bar)

    std::unique_ptr<int> unique(new int(30));
    foo = std::move(unique);
    PRINT_COUNT(foo)
    PRINT_COUNT(bar)

    std::cout << "*foo: " << *foo << '\n';
    std::cout << "*bar: " << *bar << '\n';
    return 0;
}

输出:


shared_ptr::swap  交换两个智能指针的内容,不影响其他智能指针。

#include<iostream>
#include<memory>

#define PRINT_COUNT(ptr) \
    std::cout << #ptr" use_count: " << ptr.use_count() << '\n';

int main (){
    std::shared_ptr<int> foo (new int(10));
    std::shared_ptr<int> bar (new int(20));
    std::shared_ptr<int> thr (foo);
    PRINT_COUNT(foo)
    PRINT_COUNT(bar)
    PRINT_COUNT(thr)

    foo.swap(bar);
    PRINT_COUNT(foo)
    PRINT_COUNT(bar)
    PRINT_COUNT(thr)

    std::cout << "*foo: " << *foo << '\n';
    std::cout << "*bar: " << *bar << '\n';
    std::cout << "*thr: " << *thr << '\n';
    return 0;
}

输出:


shared_ptr::reset 重置该shared_ptr的管理权(无参数则为null),不影响其他shared_ptr

#include<iostream>
#include<memory>

#define PRINT_COUNT(ptr) \
    std::cout << #ptr" use_count: " << ptr.use_count() << '\n';

int main (){
    std::shared_ptr<int> sp;     // empty

    sp.reset(new int);          // takes ownership of pointer
    *sp = 10;
    std::cout << *sp << '\n';

    sp.reset(new int);          // delete managed object, acquires new pointer
    *sp = 20;
    std::cout << *sp << '\n';

    std::shared_ptr<int> sec(sp);
    PRINT_COUNT(sp)
    PRINT_COUNT(sec)

    sp.reset();                // delete managed object
    PRINT_COUNT(sp)
    PRINT_COUNT(sec)

    return 0;
}

输出:





     

猜你喜欢

转载自blog.csdn.net/x_shuck/article/details/79761752