C++ 如何解决共享ptr循环而不使其变弱?
我已经调试这个内存泄漏几个小时了,刚刚发现程序中有一个循环 互联网上介绍的方法是使C++ 如何解决共享ptr循环而不使其变弱?,c++,C++,我已经调试这个内存泄漏几个小时了,刚刚发现程序中有一个循环 互联网上介绍的方法是使共享ptr成为弱ptr,但本作业中规定我们应使用共享ptr 基本上,该程序是一个文件系统。与键入cd.时一样,您将输入当前地址 currentAddress,它是指向当前地址的inode\u ptr 目录,定义为映射目录。第一个是文件名/目录名,如、。或fileA和目录。第二个是inode\u ptr,与当前地址相同 所以我想把pair放到目录中 而currentAddress也应指向目录 在这种情况下,如何避免内
共享ptr
成为弱ptr
,但本作业中规定我们应使用共享ptr
基本上,该程序是一个文件系统。与键入cd.
时一样,您将输入当前地址
currentAddress
,它是指向当前地址的inode\u ptr目录
,定义为映射
<代码>目录。第一个是文件名/目录名,如、。
或fileA
和目录。第二个
是inode\u ptr
,与当前地址
相同
pair
放到目录中
而currentAddress
也应指向目录
在这种情况下,如何避免内存泄漏,但不使用弱\u ptr
?谢谢 这里没有办法使用弱指针。这就是现实,这就是现实
然而,这里可以做一些事情来尽量减少弱指针的使用,并将其作为内部实现细节隐藏起来,而虚拟文件系统的用户只能看到普通的强指针
首先请注意,每个虚拟目录都有一个“.”和“.”的条目。这意味着您不需要在目录
映射中存储“.”和“.”的实际条目。目录
映射只有目录实际内容的条目
然后,您必须做一些工作,以提供一个自定义迭代器,或某种外观,将迭代器包装在目录
映射周围,并使用“.”和“.”的条目对其进行扩充,从而合成相应的inode_ptr
虚拟文件系统的用户不会直接访问目录
容器,这是一个私有的实现细节。相反,您将提供适当的方法来在虚拟容器上构造facade迭代器,该虚拟容器包含来自底层目录
映射的所有条目,以及“.”和“.”的动态合成条目
为了避免循环引用,模拟文件系统中的每个目录都需要保存一个指向其父目录的弱指针。没有其他方法可以避免循环引用。但这应该没问题。只要父目录存在,并且持有指向其子目录的强指针,则从子目录指向父目录的弱指针将保持有效。迭代器/容器facade通过合成“.”和“.”项来扩充目录
映射,它需要从弱指针恢复一个强指针,并将其作为假定的强指针返回给“.”项。类似地,目录
映射的facade将构造一个指向自身的强指针,并将其作为“.”项的值返回
最终的结果是,虚拟文件系统的用户最终仍然使用常规的强指针,而在场景中,您将使用从目录到其父目录的弱指针,以防止循环引用。实际上,您甚至需要将{,“,currentAddress}
进入目录,因为它总是隐含的?@Galik是的,实际上当前地址
和目录
属于两个不同的类,它们是私有的。目录结构只是一个简单的树结构吗(对于
和有特殊情况)。
?或者同一个inode
可以出现在两个不同的目录中吗?@Galikdirectory
是一个映射,也可以称之为映射<代码>目录。第二个
是指向文件
类或目录
类的共享ptr。但是在这种情况下,内存泄漏正好发生在