从函数的结果中分配std :: shared_ptr的一个衬里是什么?

时间:2017-09-12 13:28:13

标签: c++

要做到这一点还有一种更惯用的方式:

Potato SpecialPotato();
std::shared_ptr<Potato> givePotato()
{
    std::shared_ptr<Potato> ret;
    *ret = SpecialPotato();
    return ret;
}

2 个答案:

答案 0 :(得分:5)

*ret = SpecialPotato();不起作用,因为ret只是一个空指针,因为它是默认构造的。如果您想要返回std::shared_ptr<Potato>指向Potato并返回SpecialPotato()的值,那么您可以使用std::make_shared

std::shared_ptr<Potato> givePotato()
{
    return std::make_shared<Potato>(SpecialPotato());
}

这将动态分配Potato,使用SpecialPotato()的返回值对其进行初始化,然后返回shared_ptr

请注意,如果SpecialPotato()应该返回从Potato派生的类型,则您无法返回Potato。那将是slice the object而你丢失了对象的派生部分。将派生类型作为父类型返回时,需要使用类似指针/指针的类型,如

std::shared_ptr<Potato> SpecialPotato()
{
    return std::make_shared<SpecialPotatoType>(/* constructor parameters here */);
}   

答案 1 :(得分:0)

使用std::make_shared

Potato SpecialPotato();
std::shared_ptr<Potato> givePotato()
{
   return std::make_shared<Potato>(SpecialPotato());
}

它有专业人员在一次传递中构建std::shared_ptr和对象副本。此外,副本可能会被优化。