代码之家  ›  专栏  ›  技术社区  ›  lequinne

将std::weak_ptr创建为std::shared_ptr类型的数组的索引值?

  •  4
  • lequinne  · 技术社区  · 1 年前

    我有一个很大的数据集,基本上是这样加载的:

    for(int i=0;i<count; i++){
       auto ptr = std::make_shared<Object>(Object());
       //do stuff with ptr
    }
    

    由于内存分配是零碎的,这对性能来说不是很好。 我想做的是:

    std::shared_ptr<Object[]> allObjects; //this is stored elsewhere until the program ends
    
    allObjects.reset(new Object[count]);
    for(int i=0;i<count; i++){
       auto ptr = std::weak_ptr<Object>(&allObjects[i]);
       //do stuff with ptr
    }
    

    不幸的是,它无法编译。我可以这样试试:

    auto ptr = std::shared_ptr<Object>(&allObjects[i]);
    

    这在程序运行时效果很好,但当然,当ptr的所有副本都被销毁时,代价是巨大的。所以我希望ptr是std::weak_ptr。主数组std::shared_ptr将被存储,直到所有weak_ptr被销毁。那么,我可以为数组类型std::shared_ptr的索引成员创建std::weak_ptr吗?我只是缺少一些语法吗?我需要其他类型的容器吗?还是我错过了这种方法的根本错误?

    1 回复  |  直到 1 年前
        1
  •  7
  •   Artyer    1 年前

    使用的别名构造函数 std::shared_ptr 为此:

    auto ptr = std::shared_ptr<Object>(allObjects, &allObjects[i]);
    // and if you wanted a weak_ptr
    auto ptr = std::weak_ptr(std::shared_ptr<Object>(allObjects, &allObjects[i]));
    

    ptr 将使用与相同的控制块 allObjects (所以它也会一样 use_count 同时被摧毁,而且至关重要的是只被摧毁一次)