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

leq*_*nne 4 c++ stl std shared-ptr weak-ptr

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

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

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

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
}
Run Code Online (Sandbox Code Playgroud)

不幸的是这不能编译。我可以这样尝试:

auto ptr = std::shared_ptr<Object>(&allObjects[i]);
Run Code Online (Sandbox Code Playgroud)

这在程序运行时效果很好,但是当然,当 ptr 的所有副本都被销毁时,就要付出惨重的代价。所以我希望 ptr 成为 std::weak_ptr。主数组 std::shared_ptr 将被存储,直到所有weak_ptr被销毁。那么我可以为数组类型 std::shared_ptr 的索引成员创建一个 std::weak_ptr 吗?我只是缺少一些语法吗?我需要不同的容器类型吗?或者我是否遗漏了该方法的根本错误?

Art*_*yer 11

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]));
Run Code Online (Sandbox Code Playgroud)

ptr将使用相同的控制块allObjects(因此它将具有相同的控制use_count块并同时被销毁,而且最重要的是仅一次)