c++ - 我怎样才能生成一个 std::shared_ptr ,它在它的控制 block 中具有局部性,但是是另一个类的集合?

标签 c++ stl c++17

std::make_shared 在堆上生成只需要一次分配的控制 block /对象对,并将控制 block 和对象保持在靠近帮助位置的位置。

我想这样做,但我希望将其创建为另一个类的聚合组件。我环顾四周,但我并没有看到这样的野兽。我错过了什么吗?

例如

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;
}

最佳答案

I want the lifetime to be managed by the encompassing class, but I want weak pointer semantics. Possible?

这两个都不可能。

第一个,共享对象的生命周期由其他对象管理,违反了shared_ptr作为一个类的基本目的。关键是,只要您有一个 shared_ptr,它指向的东西就会一直存在。即使使用侵入式指针,如果您获得指向它的侵入式指针并随后通过其他方式销毁它,您也违反了侵入式指针契约。

第二个不起作用,因为弱指针语义是基于控制 block 的生命周期可以超过控制 block 管理的对象的生命周期这一事实的核心。如果两个对象的生命周期都由某个包含对象 Foo 管理,那么当 Foo 被销毁时,两者都会被销毁。因此控制 block 的生命周期在弱指针全部被销毁之前结束。

所以不,这行不通。

现在是的,有一些方法可以使这种弱指针起作用,但这些方法……令人不快。它需要有一个包含所有此类弱指针对象的链表,并在控制 block 被销毁时将它们清空。但是线程安全变得不可能(想象一下在控制 block 被销毁时复制这样一个弱指针)或者需要重量级互斥锁来进行基本复制操作。

总的来说,您想要的根本不是std::shared_ptr 的用途。你要找的是一个侵入式指针。大多数侵入式指针提案没有弱语义是有原因的。

关于c++ - 我怎样才能生成一个 std::shared_ptr ,它在它的控制 block 中具有局部性,但是是另一个类的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56654792/

相关文章:

c++ - 将二维数组和字符串 vector 作为参数传递给函数

c++ - 使用 std::copy 的问题

c++ - 过滤 STL 容器的现代方法?

c++ - 如何将 std::array<double, 100> 转换为 std::array<float, 100> ? (避免明显的样板实现)

c++ - 如何在移动到shared_ptr后调用std::function

c++ - 如何从 gcc 的预编译头文件中获益最多?

c++ - 为什么 ranges::view_interface<T>::size 需要移动构造函数

c++ - 使用 MHook 全局连接到 Cwnd::Create

c++ - Boost.Pointer 容器在 C++11/14 中被 std::unique_ptr 淘汰了吗?

c++ - 替换常量 : when to use static constexpr and inline constexpr?