《白话C++》第10章 STL和boost,Page91 std::shared_ptr常用功能03

5.  make_shard

使用上智能指针,就可以不用写“delete”这个关键字了,不过“new”这个关键字还的写

...
shared_ptr <Student> p(new Student);
p->foo();
...

这就回造成new和delete之间的对称性被严重破坏

标准库提供了make_shared方法,,可以创建出shared_ptr,不需要字面上的new操作。比如创建一个指向值为99的整数的智能指针:

std::shared_ptr <int> p(new int(99));

使用make_shared之后是:

std::shared_ptr <int> p = std::make_shared <int> (99);

make_shared()是一个函数,因此返回的智能指针可以妥妥地运用转移语义,所以此时在定义p时回到使用“=”进行初始化的传统形式(编译器在这里用了优化手段)。事实上语义是如此的明确,所以也可以配合使用auto关键字的新作用:

auto p = std::make_shared <int> (99);

当然也可以用于自定义的struct/class对象的创建过程,运用模板技术,make_shared支持构造各种自定义对象时,可能的入参个数:

class Coo
{
public:
    Coo(){}; //0个入参
    Coo(int a){}; //1个入参
    Coo(int a, std::string s, bool b){} //3个入参
};

void test()
{
    cout << "make_shared是个模版函数,支持不定个数的入参,
                内部则调用所要创建的对象的构造函数"
            ",并匹配入参。" << endl;
    auto p1 = std::make_shared <Coo> ();
    auto p2 = std::make_shared <Coo> (100);
    auto p3 = std::make_shared <Coo> (100, "Tom", true);
}

make_shared是个模版函数,支持不定个数的入参,内部则调用所要创建的对象的构造函数,并匹配入参。

如果某个类的构造函数被可以设定为非公开,那make_shared和位于类外的new操作都会失灵,通常改为调用该类设计者提供的其他构建方法。

不是很重要,但也提一下,通常使用make_shared创建shared_ptr,会比先创建裸指针,再创建shared_ptr性能略好。原因在于make_shared明确地表明了操作目的,因此在实现上可以一次性分配裸指针和智能指针本身所需的库存。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值