c++智能指针之shared_ptr

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";
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容