CreateInstance句柄泄露问题

cyldf 2009-11-27 02:40:22
程序中用到了CreateInstance,每次调用都会多出来一个semaphore句柄,用智能指针也不行
不知道为啥,有人遇到过类似问题么?
...全文
233 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
redsunxin 2010-03-22
  • 打赏
  • 举报
回复
哎,都被这个问题困扰,今天把BSTR换成CComBSTR把memory increase 解决了,但是handle increase怎么解决呢。怎么还没有被解决吗?expecting!!
z569362161 2009-11-30
  • 打赏
  • 举报
回复

说实话,你的问题没见过,

今天终于见到了.可是我不会啊!

支持,学习.
cyldf 2009-11-30
  • 打赏
  • 举报
回复
期待高手回答阿
cyldf 2009-11-27
  • 打赏
  • 举报
回复
macrojj 2009-11-27
  • 打赏
  • 举报
回复
额。。。
cyldf 2009-11-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 arong1234 的回复:]
怎么发现多出来的?你确信doc对象及所有关联的东西都释放了?
感觉如果真这样,应该啥MSXML的bug
引用楼主 cyldf 的回复:
程序中用到了CreateInstance,每次调用都会多出来一个semaphore句柄,用智能指针也不行
不知道为啥,有人遇到过类似问题么?

[/Quote]
用Process Explorer查出来的,相关资源全部释放,每次调CreateInstance都会多一个handle
arong1234 2009-11-27
  • 打赏
  • 举报
回复
怎么发现多出来的?你确信doc对象及所有关联的东西都释放了?
感觉如果真这样,应该啥MSXML的bug
[Quote=引用楼主 cyldf 的回复:]
程序中用到了CreateInstance,每次调用都会多出来一个semaphore句柄,用智能指针也不行
不知道为啥,有人遇到过类似问题么?
[/Quote]
arong1234 2009-11-27
  • 打赏
  • 举报
回复
人家是COM内部open的对象,你又没句柄,CloseHandle怎么用?
不要一看到关键字就copy现有的答案,你的答案是没有啥用的
[Quote=引用 8 楼 xg198804 的回复:]
引用 6 楼 cyldf 的回复:
引用 5 楼 xg198804 的回复:
semaphore 是内核对象,每次创建用了之后都要关闭,以减少使用计数,当使用计数减少为零时系统会自动清除

问题是我调用Release()也无济于事阿

CloseHandle() 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等.
试过没。
[/Quote]
cyldf 2009-11-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 xg198804 的回复:]
引用 6 楼 cyldf 的回复:
引用 5 楼 xg198804 的回复:
semaphore 是内核对象,每次创建用了之后都要关闭,以减少使用计数,当使用计数减少为零时系统会自动清除

问题是我调用Release()也无济于事阿

CloseHandle() 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等.
试过没。
[/Quote]
这个还真没试过,查了N多资料也没说要这么调阿
xg198804 2009-11-27
  • 打赏
  • 举报
回复
CloseHandle函数
  BOOL CloseHandle(
  HANDLE hObject
  );
  参数
  hObject :代表一个已打开对象handle。
  返回值
  TRUE:执行成功;
  FALSE:执行失败,可以调用GetLastError()获知失败原因。
  函数说明:
  关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。如在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。
  若在线程执行完之后,没有调用CloseHandle,在进程执行期间,将会造成内核对象的泄露,相当于句柄泄露,但不同于内存泄露,这势必会对系统的效率带来一定程度上的负面影响。但当进程结束退出后,系统会自动清理这些资源。
xg198804 2009-11-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cyldf 的回复:]
引用 5 楼 xg198804 的回复:
semaphore 是内核对象,每次创建用了之后都要关闭,以减少使用计数,当使用计数减少为零时系统会自动清除

问题是我调用Release()也无济于事阿
[/Quote]
CloseHandle() 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等.
试过没。
cattycat 2009-11-27
  • 打赏
  • 举报
回复
用完要关闭,调用CloseHandle()
cyldf 2009-11-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xg198804 的回复:]
semaphore 是内核对象,每次创建用了之后都要关闭,以减少使用计数,当使用计数减少为零时系统会自动清除
[/Quote]
问题是我调用Release()也无济于事阿
xg198804 2009-11-27
  • 打赏
  • 举报
回复
semaphore 是内核对象,每次创建用了之后都要关闭,以减少使用计数,当使用计数减少为零时系统会自动清除
cyldf 2009-11-27
  • 打赏
  • 举报
回复

MSXML::IXMLDOMDocumentPtr pDoc = NULL;
if(FAILED(pDoc.CreateInstance(__uuidof(MSXML::DOMDocument))))
{
error process...
}

  • 打赏
  • 举报
回复
贴出你的调用方法.
cyldf 2009-11-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jamesf1982 的回复:]
建议放到mfc论坛
[/Quote]
我觉得c/c++版块人流量大,所以才放这得
james_hw 2009-11-27
  • 打赏
  • 举报
回复
建议放到mfc论坛

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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