小编leq*_*nne的帖子

将 std::weak_ptr 创建为数组类型 std::shared_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 吗?我只是缺少一些语法吗?我需要不同的容器类型吗?或者我是否遗漏了该方法的根本错误?

c++ stl std shared-ptr weak-ptr

4
推荐指数
1
解决办法
101
查看次数

标签 统计

c++ ×1

shared-ptr ×1

std ×1

stl ×1

weak-ptr ×1