12.1.3 shared_ptr和new结合使用
shared_ptr和内置指针可以相互转化!
shared_ptr有一个接受一个内置指针参数的构造函数,因此能用一个内置指针来初始化shared_ptr;又由于该构造函数是explicit的,所以不支持隐式地用内置指针构造shared_ptr(即不支持内置指针到shared_ptr的隐式类型转换)。造成的结果是:
一、用内置指针初始化shared_ptr只能采用直接初始化,而不能采用拷贝初始化,如“shared_ptr<int> p1(new int(42))”是对的,而“shared_ptr<int> p1 = new int(42)”是错的!
二、不能用内置指针为shared_ptr对象赋值,包括函数传参和返回值!如果非要这样做,那么就显示地构造一个临时的shared_ptr对象,再进行赋值,如“p1 = shared_ptr<int>(new int(1024))”!或者更简单的,使用“p1.reset(new int(1024))”。
要注意的是,一旦用内置指针初始化shared_ptr或为其赋值,其所指内存的管理权就移交到shared_ptr手里了,如果shared_ptr计数值归零,该段内存被销毁,原来的内置指针就变成空悬指针了。因此,如果用内置指针初始化shared_ptr或为其赋值,在后面的代码中就不要再解引用该内置指针了!
反过来,使用“p.get()”可以从一个shared_ptr获得其保存的内置指针,目的是在某些不能使用shared_ptr的地方使用内置指针,但这样做要注意两点:
一、不能delete获得的内置指针!因为现在这段内存是shared_ptr管理的,delete该内置指针后,所有指向这段内存的shared_ptr都变成空悬指针了。
二、不能用获得的内置指针初始化另一个shared_ptr或为其赋值,这样两个独立计数的shared_ptr指向同一段内存,如果其中一个shared_ptr的计数归零,该段内存就会被销毁!
12.1.5 unique_ptr