如何解决Shared_ptr循环而不使其成为Weak_ptr?

时间:2016-01-31 02:27:28

标签: c++

我已经调试了几个小时的内存泄漏,并且发现程序中存在循环。

互联网上引入的方法是shared_ptr weak_ptr,但在此分配中定义我们应该使用shared_ptr

基本上,程序是一个文件系统。与您键入cd .时一样,您将输入当前地址。

  1. currentAddress,这是一个指向当前地址的inode_ptr。
  2. directory,定义为map<string, inode_ptr<node>>directory.first是文件名/目录名,如...fileAdirectory.secondinode_ptr,与{{1}相同}。
  3. 所以我正在尝试将currentAddress放入pair<".", currentAddress>

    directory也应该指向currentAddress

    在这种情况下如何避免内存泄漏,但不能使用directory?谢谢!

1 个答案:

答案 0 :(得分:4)

这里无法使用弱指针。这就是现实,它就是这样。

但是,有些事情可以在这里完成,以最大限度地减少弱指针的使用,并且大多将其隐藏为内部实现细节,并且虚拟文件系统的用户只能看到普通的强指针。

首先要注意每个虚拟目录总是有一个“。”条目。和“......”。这意味着您不需要存储“。”的实际条目。和directory地图中的“..”。 directory映射只包含目录实际内容的条目。

然后你必须做一些工作才能提供一个自定义迭代器,或者在directory映射周围包装迭代器的某种外观,并用“。”条目对它们进行扩充。和“..”,合成相应的inode_ptr<node>

虚拟文件系统的用户不会直接访问您的directory容器,这是私有的实现细节。相反,您将提供适当的方法来构建Facade迭代器,通过包含底层directory映射中的所有条目的虚拟容器,以及“。”的动态合成条目。和“..”。

为避免循环引用,模拟文件系统中的每个目录都需要保存指向其父目录的弱指针。没有其他办法可以避免周期性参考。但这应该没问题。只要父目录存在,并且拥有指向其子目录的强指针,从子目录到父目录的弱指针将保持有效。您的迭代器/容器外观,通过合成“。”来扩充directory地图。和“..”条目,将需要从弱指针恢复强指针,并返回它作为假定的强指针与“..”条目相关联。类似地,directory映射的外观将构造一个指向自身的强指针,并将其作为“。”的值返回。条目。

最终结果是虚拟文件系统的用户仍然使用常规的强指针,而在幕后,您将使用从目录到其父目录的弱指针,以防止循环引用。