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
    可以出现在两个不同的目录中吗?@Galik
    directory
    是一个映射,也可以称之为映射<代码>目录。第二个
    是指向
    文件
    类或
    目录
    类的共享ptr。但是在这种情况下,内存泄漏正好发生在