关于模拟指针代码的一点问题

本文探讨了在模拟指针的SimSpace类中Deallocate()函数的一个问题。该函数旨在回收游离节点到可用空间表,但在执行过程中,对数组下标i赋值为-1的操作引起了疑惑。作者通过调试发现,这一操作可能导致潜在的错误,尽管对测试结果没有直接影响。文中详细描述了调试过程,并提出i=-1可能是多余的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然发了篇关于模拟指针的笔记,但是其中还是由不少问题的,既有理解方面的问题,也有原来代码中可能存在的问题。我现在要说的就是后者。

在SimSpace类中有一个释放节点的操作函数,即Deallocate()。在这个函数中,

template<class T>
void SimSpace<T>::Deallocate(int& i)
{
    //释放节点i .
    //使i 成为可用空间表的第一个节点
    node[i].link = first;
    first = i;
    i = -1;
}

小编对最后这一步非常的不解。

首先,要理解这个函数的作用,这个函数是要把某个“游离”在外的节点“回收”到SimSpace可用空间表中。之所以说“游离”,观察整体代码就知道,这个“某个节点”是在SimChain链表中被删除掉的,此时若不执行Deallocate操作,那么这个节点将不能再次被使用。因为SimChain链表中的节点都是从SimSpace可用空间表中分配出来的,既然“游离”节点不在可用空间表中,那自然不可能再被分配。这实际上可以模拟c++指针的内存泄漏。嗯,我猜是这样。

好了,我是罗嗦一点。

本来函数体中前两句代码就可以使节点i成为可用空间表中的第一个节点了,这时候来一个i=-1,突然就懵了。这个i还是数组node的下标,把数组的一个下标改成-1,这么做到底是由什么深意?而且数组的每一个下标都是唯一的,这么做的话,第二句代码first所指的那个下标的值就不见了,那么node[first]就没有意义了。为了证明这点想法,我稍微做了一点调试,我是在一个c++网络课程上学到的调试,呵呵,其实之前也有用过,只是这次学得特别深刻就记住了。

我使用的代码已经贴在了之前那篇文章。调试过程如下,就是把i=-1分别注释跟不注释,然后查看相关参数的值有什么变化。

留住i=-1:
执行第66句后的情况
这里写图片描述

执行第67句后的情况,可以看到node[i].link变成一串无意义的数字,
这里写图片描述

注释掉i=-1:
执行第65句后的情况
这里写图片描述

执行第66句后的情况,node[i].link仍然指向2。
这里写图片描述

关于这里node[i].link的具体数值需要结合整个主函数的代码来看,请参考之前那篇文章。

所以,我认为这里的i=-1是多余的,虽然表面上对测试代码的结果没影响,但是却导致程序在深层次意义上出错。我参考的这本电子书来自网络,也没有封面页,不知道叫什么名字,也不知道该书有没有进行再版勘误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值