C++ 动态内存与智能指针

本文探讨了C++中智能指针与new操作符的交互,解释了shared_ptr的行为特性,包括如何处理内存分配失败,以及为什么shared_ptr没有提供release成员函数。同时,文章分析了不同场景下调用智能指针的方法及其合法性。

定位new

向new传递额外的参数。

例如:

1 int *p1 = new int; //如果分配失败,则new抛出std::bad_alloc
2 int *p2 = new (nothrow) int;//如果分配失败则new返回空指针,不抛出异常

 

如果我们像下面这样调用process,会发生什么?

void process(shared_ptr<int> ptr)
{
  //使用ptr  
}//ptr离开作用域,被销毁

process(shared_ptr<int> (p.get()));

p.get()返回一个内置指针,指向p所指向的对象,并利用其创建一个新的shared_ptr,因此不会与p动态共享内存,两者的计数器均为1,因此当离开作用域后ptr被销毁,而p成为一个管理悬空内存的shared_ptr

 

 

 

p和sp的定义如下,对于接下来的对process的每个调用,如果合法,解释它做了什么,如果不合法,解释错误原因。 

auto p = new int();
auto sp = make_shared<int> ();

(a) process(sp);

(b) process(new int());

(c) process(p);

(d) process(shared_ptr (p)); 

 

(a)合法,sp是一个共享指针,调用process时将sp传递给ptr,两者指向相同的对象,引用计数器为2,结束process后,ptr被销毁,引用计数器为1。

(b)不合法,不能讲内置指针隐式转换为shared_ptr   接受指针参数的智能指针构造函数是explicit的

(c)不合法,不能讲内置指针隐式转换为shared_ptr

(d)合法,但不建议使用,不应该混用智能指针和普通指针  当process结束后,p指向的内存会被释放,而p成为空悬指针

 

 

为什么shared_ptr没有release成员?

   因为release的作用是交出指针所指向对象的控制权,而即使shared_ptr不交出控制权,其他的shared_ptr依然可以控制此对象

转载于:https://www.cnblogs.com/blzm742624643/p/9688240.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值