从函数返回shared_ptr

时间:2014-09-24 19:25:07

标签: c++ memory smart-pointers

我有返回std :: shared_ptr又名Product_SPTR:

的Class
Product_SPTR Mill::Production(sf::Time time)
{
    if(m_isProducing)
    {
        if(elapsedTime.getElapsedTime()>m_manufacturingTime)
        {
            elapsedTime.restart();
            Flour_SPTR a(new Flour(5,1,ProductType::CONSTRUCTION),deleter<Flour>);
            return  a  ;

        }
    }

}

然后我有typedef std::vector<Product_SPTR> VectorProduct_SPTR

当我尝试将新的Product_SPTR添加到向量时,我有segmentation fault

下面:

products.push_back(a->Production(gameTime.getElapsedTime()));

但是当我做这样的事情时:

products.push_back(new Flour(5,1,ProductType::CONSTRUCTION),deleter<Flour>);

问题不会发生....

我刚刚开始使用智能指针,所以也许我不知道如何使用它..

1 个答案:

答案 0 :(得分:1)

return中的条件评估为if时,您错过了false语句。它编译,可能会给你编译器警告。除非您了解警告及其含义,否则您应始终在最高警告级别上工作并逐一消除所有警告。

另外,而不是写

Flour_SPTR a(new Flour(5, 1, ProductType::CONSTRUCTION),deleter<Flour>);
return  a;

你可能应该写

return Flour_SPTR(new Flour(5, 1, ProductType::CONSTRUCTION), deleter<Flour>);

现代编译器在优化冗余变量方面不应该有任何问题,但帮助编译器完成它的工作总是好的。如果你可以跳过删除器,你也可以写:

return std::make_shared<Flour>(5, 1, ProductType::CONSTRUCTION);