shared_ptr共享它指向的對(duì)象,內(nèi)部采用計(jì)數(shù)機(jī)制來(lái)實(shí)現(xiàn)。當(dāng)新的shared_ptr與對(duì)象關(guān)聯(lián)時(shí),引用計(jì)數(shù)加1;當(dāng)shared_ptr超出作用域時(shí),引用計(jì)數(shù)減1;當(dāng)引用計(jì)數(shù)為0時(shí),釋放該對(duì)象;
初始化方式二:
shared_ptr<A> p0 = std::make_shared<A>("西紅柿");//C++11提供
使用方法:
- 重載了*和->操作符,可以像使用指針一樣使用shared_ptr
- shared_ptr支持賦值,左值的shared_ptr的計(jì)數(shù)器將減1,右值shared_ptr的計(jì)數(shù)器加1;
shared_ptr的線程安全性;
- shared_ptr的引用計(jì)數(shù)本身是線程安全(引用計(jì)數(shù)是原子操作)
注意:如果unique-ptr能解決問題,就不要用shared_ptr。unique_ptr的效率更高,占用的資源更少;
指定刪除器,shared_ptr比較簡(jiǎn)單,給unique_ptr比較麻煩
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-422821.html
weak_ptr
一.shared_ptr內(nèi)部維護(hù)了一個(gè)共享的引用計(jì)數(shù)器,多個(gè)shared_ptr可以指向同一個(gè)資源。如果出現(xiàn)了循環(huán)引用的情況,引用計(jì)數(shù)永遠(yuǎn)無(wú)法歸0,資源不會(huì)被釋放
//循環(huán)引用demo
#include <iostream>
#include <memory>
using namespace std;
class A;
class B;
class A
{
public:
std::shared_ptr<B> ptr;
~A() {
cout << "A is deleted" << endl; // 析構(gòu)函數(shù)后,才去釋放成員變量
}
};
class B
{
public:
std::shared_ptr<A> ptr;
~B() {
cout << "B is deleted" << endl; // 析構(gòu)函數(shù)后,才去釋放成員變量
}
};
int main()
{
{
std::shared_ptr<A> ap(new A);
std::shared_ptr<B> bp(new B);
ap->ptr = bp;
bp->ptr = ap;
}
return 0;
}
⑴ weak_ptr指針初始化只能靠shared_ptr指針賦值;
⑵ 當(dāng)沒有一個(gè)shared_ptr指針指向weak_ptr指向的內(nèi)存區(qū)域時(shí),expired成員函數(shù)返回true;
⑶ 當(dāng)weak_ptr指針為空時(shí),expired成員函數(shù)返回true。
② lock成員函數(shù):返回一個(gè)shared_ptr類型的指針
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-422821.html
?
到了這里,關(guān)于智能指針shared_ptr的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!