代碼1 #include <iostream> #include <thread> using namespace std; class A { public: A() { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; } void ...
代碼1
#include <iostream>
#include <thread>
using namespace std;
class A {
public:
A() { cout << "A()" << endl; }
~A() { cout << "~A()" << endl; }
void funcA() {
cout << "A function()" << endl;
}
};
void thread_Handler(A *pa) {
std::this_thread::sleep_for(std::chrono::seconds(2));
pa->funcA();
}
int main() {
A *pa = new A();
thread t1(thread_Handler, pa);
delete pa;
t1.join();
return 0;
}
上面代碼的問題:
std::this_thread::sleep_for(std::chrono::seconds(2));
後 pa指針已經main 線程中delete 掉了,刪掉之後在訪問 funcA()函數是不合理的
應該修改為
void thread_Handler(A *pa) {
std::this_thread::sleep_for(std::chrono::seconds(2));
if(pa所指向的對象是否還有效)
{
pa->funcA();
}
}
//針對上面的場景,我們可以使用強弱智能指針,修改如下
代碼2
#include <iostream>
#include <thread>
using namespace std;
class A {
public:
A() { cout << "A()" << endl; }
~A() { cout << "~A()" << endl; }
void funcA() {
cout << "A function()" << endl;
}
};
void thread_Handler(weak_ptr<A> pa) {
std::this_thread::sleep_for(std::chrono::seconds(2));
shared_ptr<A> ptr = pa.lock();
if (ptr == nullptr) {
cout << "對象已經銷毀了" << endl;
}
else {
ptr->funcA();
}
}
int main() {
{
shared_ptr<A> ptr(new A());
thread t1(thread_Handler, weak_ptr<A>(ptr));
t1.detach();
}
std::this_thread::sleep_for(std::chrono::seconds(10));
return 0;
}
share_ptr
share_ptr是C++11新添加的智能指針,它限定的資源可以被多個指針共用。
只有指向動態分配的對象的指針才能交給 shared_ptr 對象托管。將指向普通局部變數、全局變數的指針交給 shared_ptr 托管,編譯時不會有問題,但程式運行時會出錯,因為不能析構一個並沒有指向動態分配的記憶體空間的指針
weak_ptr
weak_ptr是一種用於解決shared_ptr相互引用時產生死鎖問題的智能指針。如果有兩個shared_ptr相互引用,那麼這兩個shared_ptr指針的引用計數永遠不會下降為0,資源永遠不會釋放。weak_ptr是對對象的一種弱引用,它不會增加對象的use_count,weak_ptr和shared_ptr可以相互轉化,shared_ptr可以直接賦值給weak_ptr,weak_ptr也可以通過調用lock函數來獲得shared_ptr。
weak_ptr指針通常不單獨使用,只能和 shared_ptr 類型指針搭配使用。將一個weak_ptr綁定到一個shared_ptr不會改變shared_ptr的引用計數。一旦最後一個指向對象的shared_ptr被銷毀,對象就會被釋放。即使有weak_ptr指向對象,對象也還是會被釋放。
weak_ptr並沒有重載operator->和operator *操作符,因此不可直接通過weak_ptr使用對象,典型的用法是調用其lock函數來獲得shared_ptr示例,進而訪問原始對象。