1 shared_ptr指针初始化
1.1 通过一个已存在的普通指针进行初始化
此种方法不建议,因为如果原始指针指向的空间被释放掉的话,同时会引起指针指针的异常
// 定义普通指针p
int* p = new int (10);
// 通过普通指针创建智能指针a
std::shared_ptr<int> a (p);
// 如果此时删除原始指针p,后面智能指针a则会出现异常
delete p;
1.2 通过make_shared进行初始化
std::shared_ptr<int> a = std::make_shared<int>(10);
std::cout << *a << "\n";
1.3 通过另一个智能指针进行初始化
这种情况下多用于参数传递
// Teacher类中有一个成员变量std_,其类型是智能指针。
class Teacher
{
public:
Teacher();
void setStu(const std::shared_ptr<Student> &stu);
private:
std::shared_ptr<Student> stu_ = nullptr;
};
通过=运算符,对一个智能指针进行赋值。两者指向同一个智能指针对象,赋值后,智能指针的使用次数+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";
注意:
其实b.get()和b指向的是同一个地址,因此对其做取值得到的结果也相同
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";
网友评论