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

定位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依然可以控制此对象

posted @ 2018-09-21 20:01  DXYE  阅读(311)  评论(0编辑  收藏  举报