youngyangyang04 / Skiplist-CPP

A tiny KV storage based on skiplist written in C++ language| 使用C++开发,基于跳表实现的轻量级键值数据库🔥🔥 🚀

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

对于优化项目中内存无法delete的情况的修改

KongFu8ToFu opened this issue · comments

template<typename K, typename V>
Node<K, V>::~Node() {
delete []forward;
};
开始之前先叠个甲,我比较菜,如果所言有差错,还望各路大神指正。
这里这个析构函数中delete这个二维数组的操作在我个人看来是会有内存泄漏的风险的。我查阅了一些底层的原理,发现delete并不会将这个二维数组彻底删除。下面是我个人在vs上的调试过程:
屏幕截图 2023-10-12 214757
这里我使用同样的方法定义了一个二维数组,在删除时设置断点,首先我们来查看二维数组的地址。
image
在进行delete[]Array之后,我进行了对内存地址的搜索,发现,被删除的只有*Array之中的内容,但是原先分配给**Array之中的内存并没有被删除:
在进行删除之前,查阅内存:
image
image
在进行删除之后,再进行查阅:
image
image
image
我们会发现确实有内存是没有删干净的。
根据我个人的理解,我认为这个过程可以使用下面的图来表示:
image
image
综上,我认为这边一段代码应该修改为:
template<typename K, typename V>
Node<K, V>::~Node() {
for(int i=0;i<level+1;i++){
delete []forward[i];
}
delete[] forward;
};
另外上面的图片有一张搜索的内存上面运行的图片里没有,那是因为我运行了两次,都是选的Array[][]中的内存地址来查询,是没有问题的。
如有错误希望大神可以耐心指正,让我知道我是哪里知识有欠缺>_<

这个跟我想到的一个问题很像。
比如在对象A中有一个指针指向实例对象B,然后这时候定义指针ptr指向A:
A* ptr = new A(new B());,
然后delete这个指针:
delete(ptr),
这个时候A对象没了,但是B对象还在,感觉和你说的这个有点相像。感觉这里其实是大家误解有一个递归释放的过程,其实是没有的,还是需要我们手动递归delete

不报错吗QAQ