链表合理释放,却依然内存泄漏,不解.

perfect0729 2011-12-08 10:21:56
想利用链表保存自定义类的对象;
下面是我写的测试伪代码;
class A // 自定义类 A
{
......;
}

struct list // 链表结构
{
A* a; // 链表中的数据,自定义类的对象指针
list* next; // 下一个节点的指针
}

main()
{
list* list = new list (); // 这里先申请个list作为链表的头
list* pTest = list,*pT; // 用来遍历的指针
// 然后申请空间
for(int k = 0;k < 1000000;k++) // 多申请些,申请个长长的链表 ******** 这里断点监视了内存******
{
pTest -> next = new list (); // 只申请后继节点,对链表中的数据先不考虑。
pTest = pTest -> next;
}
// 然后全部释放
pTest = list; // 将指针指向链表头,准备释放
for(int k = 0;k < 1000000;k++) // 开始释放,和原来的长度一样 ******** 这里断点监视了内存******
{
*pT = pTest->next; // 保存后继节点的地址。
delete pTest;
pTest = pT; // 将指针指向后继节点。
}
******** 这里断点监视了内存******
}

// 代码大概就是这样,按道理来说申请了1000000的长度,又释放了1000000个节点(还是1000001个),内存不应该有泄漏啊。
但是,随着K的值增加,内存泄漏也明显的增加。
不明白原因,请高手指点。
******************************************
我起初认为,是不是由于结构体内存对齐方面的原因。申请的时候每个节点的空间大了,但是释放的时候按照应有的空间释放了呢?
...全文
176 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
perfect0729 2011-12-09
  • 打赏
  • 举报
回复
还是上网下个工具试试了。感谢大家,新手分不多一人一些。
perfect0729 2011-12-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gaoqiangz 的回复:]
你这段代码有问题:
*pT = pTest->next; // 保存后继节点的地址。
----------------------
应该是pT = pTest->next;才是保存下一个节点的地址
[/Quote]
对不起 ,笔误,谢谢改正
duke56 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 gaoqiangz 的回复:]

你这段代码有问题:
*pT = pTest->next; // 保存后继节点的地址。
----------------------
应该是pT = pTest->next;才是保存下一个节点的地址
[/Quote]

都是指针了,还要让指针指向的内容为下一个的地指针的地址
Snight 2011-12-08
  • 打赏
  • 举报
回复
list* pTest = list,pT; // 用来遍历的指针


pT = pTest->next;
delete pTest;
pTest = pT
风vs雷 2011-12-08
  • 打赏
  • 举报
回复
pT的*去掉,悲剧你也太不小心了;网上好多内存泄露检测工具,自己下个用用。
路人甲cw 2011-12-08
  • 打赏
  • 举报
回复
你这段代码有问题:
*pT = pTest->next; // 保存后继节点的地址。
----------------------
应该是pT = pTest->next;才是保存下一个节点的地址
小时了了 2011-12-08
  • 打赏
  • 举报
回复
任务管理器观看内存的变化本身就不太准确,具体原因没研究过。最好的方式是用我前面说的方法或者第三方工具检测,没问题就OK了。

内存泄露若满足两个条件件则问题不大,可以不予理会:
1. 不是在循环内部或者频繁调用的函数中,也就是说不会随着时间递增;
2. 泄露量不大

比如这行代码list* list = new list ();虽然没有释放,但是对程序没影响。当然,最好是养成好的习惯,分配了内存马上就写出对应的释放代码,然后再写其他业务逻辑。

所有泄露的内存在进程退出时都会被系统回收。
perfect0729 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xrunning 的回复:]
除了第一个new没有对应的释放代码外没看出来还有什么问题。
1000000次分配占用了8M内存,有点小不容易看出效果,你在list中定义一个100字节左右的数组成员再试下看。
[/Quote]
请教下,是不是有一点内存和以前不一样,就算内存泄漏了。
这么长的链表,释放后,多少会有几KB的内存增长。而不是和释放前的内存一样。这是不是少量的内存泄漏?
PS:
我就是使用任务管理器,观看内存的变化。
小时了了 2011-12-08
  • 打赏
  • 举报
回复
除了第一个new没有对应的释放代码外没看出来还有什么问题。
1000000次分配占用了8M内存,有点小不容易看出效果,你在list中定义一个100字节左右的数组成员再试下看。
perfect0729 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xrunning 的回复:]
断点监视内存意义不大,好像对内存占用的检测不是实时的,可以使用CRT自带的内存泄露检测机制看是否有未释放的内存。
或者重载new/delete自己检测。
[/Quote]
那么请问我这个代码是否有泄漏的可能?
小时了了 2011-12-08
  • 打赏
  • 举报
回复
断点监视内存意义不大,好像对内存占用的检测不是实时的,可以使用CRT自带的内存泄露检测机制看是否有未释放的内存。
或者重载new/delete自己检测。

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧