c++智能指針之shared_ptr

1 shared_ptr指針初始化

1.1 通過一個(gè)已存在的普通指針進(jìn)行初始化

此種方法不建議,因?yàn)槿绻贾羔樦赶虻目臻g被釋放掉的話,同時(shí)會(huì)引起指針指針的異常

// 定義普通指針p
int* p = new int (10);
// 通過普通指針創(chuàng)建智能指針a
std::shared_ptr<int> a (p);
// 如果此時(shí)刪除原始指針p,后面智能指針a則會(huì)出現(xiàn)異常
delete p;

1.2 通過make_shared進(jìn)行初始化

std::shared_ptr<int> a = std::make_shared<int>(10);
std::cout << *a << "\n";

1.3 通過另一個(gè)智能指針進(jìn)行初始化

這種情況下多用于參數(shù)傳遞

// Teacher類中有一個(gè)成員變量std_,其類型是智能指針。
class Teacher
{
public:
    Teacher();
    void setStu(const std::shared_ptr<Student> &stu);
    
private:
    std::shared_ptr<Student> stu_ = nullptr;
};

通過=運(yùn)算符,對(duì)一個(gè)智能指針進(jìn)行賦值。兩者指向同一個(gè)智能指針對(duì)象,賦值后,智能指針的使用次數(shù)+1。

void Teacher::setStu(const std::shared_ptr<Student> &stu)
{
    std::cout << stu.use_count() << std::endl;
    stu_ = stu;
    std::cout << stu.use_count() << std::endl;
}

2 獲取shared_ptr管理的原始指針

shared_ptr提供了get方法來獲取其管理的指針

std::shared_ptr<int> b = std::make_shared<int>(10);
int* bp = b.get();
// 打印10
std::cout << *bp << "\n";

注意:
其實(shí)b.get()和b指向的是同一個(gè)地址,因此對(duì)其做取值得到的結(jié)果也相同

std::shared_ptr<int> b = std::make_shared<int>(10);
// 下面兩行都打印0x1f10f64
std::cout << b.get() << "\n";
std::cout << b << "\n";
// 下面兩行都打印10
std::cout << *b.get() << "\n";
std::cout << *b << "\n";
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容