繁体   English   中英

如何解决这种循环依赖?

[英]How can I work around this circular dependency?

我正在制作一种索引列表。 我有一个看起来像这样的结构:

struct MyList {
    list<Word> records;
    map<char, list<list<Word>::iterator>> index;
    void add_word(Word);
    void erase_by_letter(char&);
};

每次我将 Word 添加到 MyList 时,对于它具有的每个唯一字符,我都会在其上添加一个迭代器到“索引”映射中。 这样我可以快速访问每个包含字母“a”或字母“n”等的单词。但这有一个问题:从记录中删除一个单词后,索引中指向它的每个迭代器都变得无效。 要解决这个问题,每个 Word 都会在其上存储一个引用列表,并且 ~Word() 在对象删除时清理它们。 它看起来像这样:

struct Word {
   Word(string);
   ~Word();
   vector<pair<list<list<Word>::iterator>*, list<list<Word>::iterator>::iterator>> refs;
   void add_ref(pair<list<list<Word>::iterator>*, list<list<Word>::iterator>::iterator>);
   void clean_refs();
   string value;
};

所以。 到目前为止,所有这些都运行良好。 在我的菜鸟眼中,它看起来不是一个好的设计,但我可以接受。 问题是 GDB 不能。 我使用 VS Code + GDB,每次调试器靠近这个结构时,它都会停止响应。 我的猜测是它进入了一个无限循环,因为索引中的条目指向记录中的Word ,而Word本身具有内部refs向量,该向量指向索引条目等等,如此糟糕的调试器只能盯着深渊。

两个问题:

  1. 我可以让 GDB 停止对这个循环的深入研究,或者可能检测到它并放弃它吗?
  2. 我应该如何正确实现这一点以避免循环引用?

让我们回到最初的问题:删除单词迭代器无效。

首先,我会删除您在 Word 结构中配置的所有参考资料,以便恢复到干净的状态。

所以现在,我们有这个:

struct Word
{
   Word(string);
   ~Word();
   
   string value;
};

现在,让我们继续您的 struct MyList。 正如您所解释的,问题是在删除指向它的单词您拥有的无效迭代器。

这是我的建议:

在用于从 MyList 中删除单词的 delete 方法中,在删除相关单词之前, 1.遍历 MyList 并让迭代器指向您的 Word。

然后, 2.解析你的迭代器映射并删除与步骤1相同的迭代器。

最后, 3.从 MyList 中删除你的单词。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM