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