区别: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;
}
输出: