#include <thread> #include <memory> #include <Windows.h> int main() { std::thread t; { std::shared_ptr<int> p(new int(1), [](int* p) { printf("delete "); delete p; }); t = std::thread([&]() {Sleep(10000); printf("*p:%d ", *p); }); } Sleep(20000); t.join(); system("pause"); return 0; }
上面使用引用传参,打印结果为:
证明了智能指针的引用不会增加智能指针的引用计数。下面换成 将智能指针用值传递,也就是发生拷贝:
#include <thread> #include <memory> #include <Windows.h> int main() { std::thread t; { std::shared_ptr<int> p(new int(1), [](int* p) { printf("delete "); delete p; }); t = std::thread([=]() {Sleep(10000); printf("*p:%d ", *p); }); } Sleep(20000); t.join(); system("pause"); return 0; }
打印结果为:
只有在std::shared_ptr发生copy时,计数才会增加,而在增加它的引用(&)时,计数不会增加。
新手容易混淆的点,这里搞错很容易在传参时引用已经销毁了的资源,导致程序崩溃哦。