rosebush 发表于 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的释放引起的

winston 发表于 2007-12-27 21:30:00

内存泄露的情况,要具体分析,如果循环运行中产生的数值很小,则程序可能可以运行很长时间,但是一定会耗光系统的资源,造成崩溃或者停止处理,并不会立刻死掉。

rosebush 发表于 2007-12-28 13:59:17

最简单的办法就是定期重启程序,进程退出的时候会自动释放所有的资源:0

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

内存的只增不减。也有可能和你前一个问题有关,是否所有的情况都释放了handle对象等等

开发者 发表于 2007-12-28 14:43:03

我现在能想到的就是socket资源没有释放,导致虚拟内存使用逐渐上升,并导致新的socket资源申请就会失败。

winston 发表于 2007-12-28 18:05:09

用purify 或者 boundschecker 追查,预计很快就找到答案了。

开发者 发表于 2008-1-29 18:41:26

请问有没有purify 或者 boundschecker ,给我传一份啊!谢谢!
页: 1 2 [3]
查看完整版本: socket关不掉吗?