std::make_shared在堆上生成只需要分配一次的控制块/对象对,并将控制块和对象保持在近距离以帮助局部性。

除了要将其创建为另一个类的聚合组件之外,我想这样做。我环顾四周,但没有看到这样的野兽。我想念什么吗?

例如。

struct Bar {};
struct Foo
{
  // This would allocate the control block and object Bar on
  // the heap, which is pointed at by Foo.
  std::shared_ptr<Bar> x;

  // Example that would allocate the control block and object Bar as
  // an aggregate part of Foo. local_shared_ptr is not an actual thing
  // in the stl that I can find.
  std::local_shared_ptr<Bar> y;
}

最佳答案

我希望生命周期由包含类来管理,但我希望指针的语义较弱。可能?


这些都不可能。

第一个共享对象的生命周期由其他对象管理,这违反了shared_ptr作为类的基本目的。关键是,只要您有shared_ptr,它所指向的内容将始终存在。即使使用侵入式指针,如果您获得了一个侵入式指针协定,但随后又通过其他方式破坏了它,则您仍然违反了侵入式指针协定。

第二个不起作用,因为弱指针语义是其核心,这是基于以下事实:控制块的生存期可能超过控制块管理的对象的生存期。如果两个对象的生存期都由某些包含对象的Foo管理,则当Foo被销毁时,两个对象都将被销毁。因此,在弱指针全部被销毁之前,控制块的生存期已结束。

所以不,这是行不通的。

现在是的,有很多方法可以使这样的弱指针起作用,但是这些方法是……令人不愉快的。它要求拥有所有这些弱指针对象的链表,并在销毁控制块时将其清空。但是,线程安全要么变得不可能(想象一下在破坏控制块时复制这样的弱指针),要么就需要对基本复制操作进行重互斥锁定。

总体而言,您想要的不是std::shared_ptr的用途。您正在寻找的是一个侵入式指针。而且有一个原因为什么大多数侵入性指针建议没有弱语义。

09-06 06:48