C++中的循环类型依赖项死锁

Circular type dependency deadlock in C++

本文关键字:依赖 死锁 类型 循环类 循环 C++      更新时间:2023-10-16

FooBar是类型。 Foo有一个Bar bar成员,Bar有一个Foo foo成员:

struct Foo;
struct Bar;
struct Foo { Bar bar; };
struct Bar { Foo foo; };

这无法编译,因为必须定义Foo才能定义Bar,但在定义Bar之前无法定义Foo - 死锁。

这个问题有解决方案吗?

全能的标准:

§ 9.2/9

非静态 (9.4) 数据成员不得具有不完整的类型。在 特别是,类 C 不应包含类的非静态成员 C,但它可以包含指向类 C 对象的指针或引用。

和:

§ 9.2/19

如果标准布局类对象具有任何非静态数据成员,则其 地址与其第一个非静态数据的地址相同 成员。否则,其地址与其第一个地址相同 基类子对象(如果有)。

您可以使用

以下方案(即使用指针而不是具体对象):

struct Foo;
struct Bar;
struct Foo 
  {
  Bar *bar; 
  };
struct Bar 
  {
  Foo *foo; 
  };

并在代码中适当地分配/解除分配barfoo

原因:虽然你转发声明了你的结构,但编译器不知道如何在你的Foo结构中分配Bar具体的对象,因为它还没有看到Bar的引用。