- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经调试这个内存泄漏几个小时了,只是发现程序中有一个循环。
网上介绍的方法是制作shared_ptr
一个weak_ptr
, 但在这个作业中定义了我们应该使用 shared_ptr
.
基本上,该程序是一个文件系统。比如当你输入 cd .
,您将输入当前地址。
currentAddress
, 这是一个指向当前地址的 inode_ptr。directory
,定义为 map<string, inode_ptr<node>>
. directory.first
是文件名/目录名,如 .
, ..
, 或 fileA
和 directory.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/
我是一名优秀的程序员,十分优秀!