gpt4 book ai didi

c++ - 如何在不使 Weak_ptr 的情况下解决 Shared_ptr Cyclic?

转载 作者:太空狗 更新时间:2023-10-29 20:55:43 25 4
gpt4 key购买 nike

我已经调试这个内存泄漏几个小时了,只是发现程序中有一个循环。

网上介绍的方法是制作shared_ptr一个weak_ptr , 但在这个作业中定义了我们应该使用 shared_ptr .

基本上,该程序是一个文件系统。比如当你输入 cd . ,您将输入当前地址。

  1. currentAddress , 这是一个指向当前地址的 inode_ptr。
  2. directory ,定义为 map<string, inode_ptr<node>> . directory.first是文件名/目录名,如 . , .. , 或 fileAdirectory.second是一个 inode_ptr , 与 currentAddress 相同.

所以我正在尝试将 pair<".", currentAddress>进入directory .

currentAddress还应指向 directory

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

最佳答案

这里没有办法绕过使用弱指针。这就是这里的现实,它就是这样。

但是,这里可以做一些事情来尽量减少弱指针的使用,并将其隐藏为内部实现细节,虚拟文件​​系统的用户只会看到普通的强指针。

首先要注意每个虚拟目录总是有一个“.”条目。和 ”..”。这意味着您不需要存储“.”的实际条目。和“..”在你的directory map 。 directory map 只有目录实际内容的条目。

然后您将不得不做一些工作以提供自定义迭代器,或某种将迭代器包装在 directory 周围的外观。映射,并用“。”的条目扩充它们。和“..”,合成相应的inode_ptr<node> .

您的虚拟文件系统的用户不会访问您的 directory直接容器,它是一个私有(private)的实现细节。相反,您将提供适当的方法来构建您的外观迭代器,通过一个虚拟容器,该容器包含来自底层 directory 的所有条目。 map ,加上“。”的即时合成条目。和“..”。

为避免循环引用,模拟文件系统中的每个目录都需要保存一个指向其父目录的弱指针。没有其他方法可以避免循环引用。但这应该没问题。只要父目录存在,并且持有指向其子目录的强指针,从子目录到父目录的弱指针就一直有效。你的迭代器/容器外观,它增强了 directory通过合成“.”来映射和“..”条目,将需要从弱指针恢复强指针,并将其作为与“..”条目相关联的假设强指针返回。同样,门面为directory map 将构造一个指向自身的强指针,并将其作为“.”的值返回。条目。

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

关于c++ - 如何在不使 Weak_ptr 的情况下解决 Shared_ptr Cyclic?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35109662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com