C++ primer 第十二章 动态内存与智能指针 不要混合使用普通指针和智能指针 笔记

不要混合使用普通指针和智能指针

使用一个内置指针来访问一个智能指针所负责的对象是很危险的,因为我们无法知道对象何时会被销毁。

  • 推荐使用make_shared,而不推荐使用new
  • 使用make_shared,我们就能在分配对象的同时就将shared_ptr与之绑定,避免了无意中将同一块内存绑定到多个独立创建的shard_ptr上;
#include<iostream>
#include<memory>

//在函数被调用的时候ptr被创建并初始化
void process(std::shared_ptr<int> ptr) { 
	//使用ptr
};//ptr离开作用域,被销毁

int main(){
    //不要混合使用普通指针和智能指针
    int* x(new int(3));					//x是一个普通指针,不是一个智能指针
    process(std::shared_ptr<int>(x));	//合法的,但内存会释放
    int j = *x;							//未定义:x是一个空悬指针
    std::cout << j << std::endl<<x<<std::endl;	//j = -572662307
}	//均未报错,但是j不是我们想要的值

在上面的调用中,在临时对象ptr被销毁时,x的引用计数递减
从初始化时候的1减为了0,所指向的内存被释放,从而变成空悬指针

正确使用process

#include<iostream>
#include<memory>

void process(std::shared_ptr<int> ptr) { };

int main(){
    shared_ptr<int> x(new int(3));		//引用计数为1					
    process(x);							//拷贝时引用计数加1,销毁时减1
    int j = *x;						
    std::cout << j << std::endl<<x<<std::endl;	//j = 3
}	

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值