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";