shared_ptr,unique_ptr和make_shared,make_unique

发布时间 2023-04-28 15:33:38作者: 海蓝笨

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不支持