c++ - 从函数返回 shared_ptr

标签 c++ memory smart-pointers

我有一个返回 std::shared_ptr aka Product_SPTR 的类:

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 添加到 vector 时,我有 segmentation fault

这里:

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

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

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

问题没有发生....

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

最佳答案

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

另外,不用写

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);

关于c++ - 从函数返回 shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26024872/

相关文章:

c++ - 同时读取两个文件

c++ - 为什么我们应该使用带有唯一指针的 std::move 语义?

c++ - 正确使用 std::unique_ptr 和 std::weak_ptr

c++ - 如何从极长的 C++ 字符串生成 char* kmers

ios - 使用 UIImagePickerController 时的内存警告

c++ - 调用 shared_ptr 对象方法

c++ - 使用rvm安装ruby时出错

c++ - 求和到几何序列的无穷大

c++ - 静态编译共享库

c++ - 变量 'equation' 周围的堆栈已损坏