std::shared_ptr<widget> p(new widget());
auto p=std::make_shared<int>(widget);
两者的不同:
1.使用make_shared的时候widget只写了一次,
2.当遇到函数传参时,由于编译器执行顺序的不同,如果使用shared_ptr这种方式,当new widget之后,后面的参数函数执行然后出现异常导致程序退出,此时就会出现内存泄漏。
比如:
int func(std::shared<widget>(new widget),compute())
可以分开
std::shared<widget> p(new widget);
int func(p,compute());//这样就不会存在内存泄漏,但是第一种,是一个右值,第二种是一个左值,使用的拷贝构造,引用计数会加一是一个原子操作。代价会变高,可以使用move=来变为右值降低代价
int func(std::move(p),compute());
使用make_shared则不会出现这样的情况。
但是shared_ptr支持自定义析构,而make_shared不支持
标签:std,widget,make,new,shared,unique,ptr From: https://www.cnblogs.com/hailanben/p/17362324.html