shared_ptr,unique_ptr和make_shared,make_unique

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

posted @   海蓝笨  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示