#include <thread> #include <memory> #include <Windows.h> int main() { std::thread t; { std::shared_ptr<int> p(new int(1), [](int* p) { printf("delete\n"); delete p; }); t = std::thread([&]() {Sleep(10000); printf("*p:%d\n", *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\n"); delete p; }); t = std::thread([=]() {Sleep(10000); printf("*p:%d\n", *p); }); } Sleep(20000); t.join(); system("pause"); return 0; }
打印結果為:
只有在std::shared_ptr發生copy時,計數才會增加,而在增加它的引用(&)時,計數不會增加。
新手容易混淆的點,這里搞錯很容易在傳參時引用已經銷毀了的資源,導致程序崩潰哦。