找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: 开发者

socket关不掉吗?

[复制链接]
发表于 2007-12-27 16:37:37 | 显示全部楼层

问题的关键所在

proactor我研究了很就,类似的问题也困扰我很久了,它的根本原因在于异步操作上,也就是说,在proactor回调你service_handle之前,handle所用到的内存资源(对象)就已经被释放了,具体到你的程序来看就是,在handle_read和handle_write中都delete了this,这样在端口关闭的时候,如果同时有未完成的read和write事件返回非成功或者transferred == 0,那么你的这个testB对象就会被delete两次,而你testB的析构函数中又访问了成员变量,这样第二次删除的时候就会非法访问。

当然你给出的代码不全,TestA和TestB之间的关系还不是太清楚,分析可能还有漏洞,希望大家一起探讨
 楼主| 发表于 2007-12-27 18:33:28 | 显示全部楼层
谢谢,我这个问题解决了!

现在的问题是,如果程序有内存泄露,应该很容易死掉的,可是我的程序不会死掉,一直跑着,会不会是由于accept socket的释放引起的
发表于 2007-12-27 21:30:00 | 显示全部楼层
内存泄露的情况,要具体分析,如果循环运行中产生的数值很小,则程序可能可以运行很长时间,但是一定会耗光系统的资源,造成崩溃或者停止处理,并不会立刻死掉。
发表于 2007-12-28 13:59:17 | 显示全部楼层
最简单的办法就是定期重启程序,进程退出的时候会自动释放所有的资源:0

要找到问题的话,应该加强调试输出,比如给类进行引用计算这类的,看到底那个类的对象导致了

内存的只增不减。也有可能和你前一个问题有关,是否所有的情况都释放了handle对象等等
 楼主| 发表于 2007-12-28 14:43:03 | 显示全部楼层
我现在能想到的就是socket资源没有释放,导致虚拟内存使用逐渐上升,并导致新的socket资源申请就会失败。
发表于 2007-12-28 18:05:09 | 显示全部楼层
用purify 或者 boundschecker 追查,预计很快就找到答案了。
 楼主| 发表于 2008-1-29 18:41:26 | 显示全部楼层
请问有没有purify 或者 boundschecker ,给我传一份啊!谢谢!
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-6-2 08:46 , Processed in 0.021267 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表