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
的用途。您正在寻找的是一个侵入式指针。而且有一个原因为什么大多数侵入性指针建议没有弱语义。