make_shared函数特点:
1)make_shared是一个模板函数;
2)make_shared模板的使用需要以**“显示模板实参”**的方式使用。
3)make_shared在传递参数格式是可变的,参数传递为生成类型的构造函数参数,因此在创建shared_ptr对象的过程中调用了类型T的某一个构造函数。
make_shared和shared_ptr的区别:
struct A; std::shared_ptr p1 = std::make_shared(); std::shared_ptr p2(new A);
区别是:std::shared_ptr构造函数会执行两次内存申请,而std::make_shared则执行一次。
std::shared_ptr在实现的时候使用的refcount技术,因此内部会有一个计数器(控制块,用来管理数据)和一个指针,指向数据。
因此在执行std::shared_ptr p2(new A)的时候,首先会申请数据的内存,然后申请内控制块,因此是两次内存申请,而std::make_shared()则是只执行一次内存申请,将数据和控制块的申请放到一起。
#include#include using namespace std; class B; class A{ public: A(){cout<<"a()~"< cout<<"a good func"< cout<<"~A()"< ptrb;//ptrb对应的内存的引用不会加一 }; class B{ public: B(){cout<<"B()~"< cout<<"~B()"< cout<<"use A func: "; shared_ptr ba=ptra.lock();//提升方法,该方法可应用于多线程 if(ba !=NULL) ba->testA(); } //shared_ptr ptra;//存在交叉引用风险 weak_ptr ptra;//引用不会加一 }; int main() { cout<<"begin"< shared_ptr pa(new A()); shared_ptr pb(new B()); cout< ptrb=pb; pb->ptra=pa; cout< testB(); } cout<<"end"< 三、unique_ptr 一个unique_ptr "拥有"他所指向的对象。与shared_ptr不同,某个时刻只能有一个unique_ptr指向一个给定的对象。当unique_ptr被销毁时,它所指向的对象也被销毁。uniptr_ptr表达的是一种"独占"的思想。
虽然我们不能拷贝赋值unique_ptr,但是可以通过调用release或者set将指针的所有权从一个(非const)unique_ptr转移给一个unique:



