虽然发了篇关于模拟指针的笔记,但是其中还是由不少问题的,既有理解方面的问题,也有原来代码中可能存在的问题。我现在要说的就是后者。
在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是多余的,虽然表面上对测试代码的结果没影响,但是却导致程序在深层次意义上出错。我参考的这本电子书来自网络,也没有封面页,不知道叫什么名字,也不知道该书有没有进行再版勘误。