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明确地表明了操作目的,因此在实现上可以一次性分配裸指针和智能指针本身所需的库存。