我最近一直在搞乱多媒体库SFML。我使用C#,所以我自然而然地选择了.Net绑定,你可以在最新的2.0版本中从SVN中获取。经过一段时间的乱搞,我注意到我的应用程序有时会在使用Text对象时挂断,Text对象是用于绘制纹理字体的对象。
使用分析器和全能的Windows任务管理器进行的进一步调查显示,使用Text的简单应用程序似乎在某种程度上泄漏了内存。然后我在SFML论坛上发了一个关于它的帖子(the thread)。但是,SFML的主要开发人员无法重现他的机器上的错误。我觉得我不能发疯,我把它发给了朋友,他报告说他确实看到了这件事。
我为劳伦特(SFML的开发者)做了一个例子,但他仍然无法重现这个错误。考虑到这可能与操作系统有关,我将文件发送给我所有人,并询问他们的操作系统。以下是我的结果:
http://spreadsheets.google.com/ccc?key=0AhcHeJlLGEVUdG1TTi1mTkFxeFlHYVRISXhjbFBDUmc&hl=en
正如你所看到的,Turc和K7都有相同的操作系统,但它不会在K7上崩溃(表格是不完整的,测试候选人还没有在那里重新投入)。无论如何,这告诉我显然它不是操作系统问题。
所以我的实际问题是,除了操作系统或体系结构之外还有什么其他因素可以影响这样的错误,只会出现在某些系统上?
供参考,这是我发给朋友的文件: http://dl.dropbox.com/u/3310651/MemLeak2.rar
我的分析截图: http://dl.dropbox.com/u/3310651/sfml_memleak.png
谢谢!
答案 0 :(得分:1)
我不确定是什么导致了这种差异,但鉴于您可以在您的机器上重现该问题,一个选项是调查为什么所有Text对象都在闲逛。您可以通过使用“sos”调试库并查询以查找Text对象的根源来完成此操作。在Visual Studio中使用sos的一个很好的介绍是here。
如果您只拥有Visual Studio的Express版本,则可以使用WinDbg调试器中的sos,它是Debugging Tools for Windows的一部分。可以找到另一个适合使用带有WinDbg的sos的好的概述here。
答案 1 :(得分:0)
经过一段时间的谈论IRC后,我想出来了,伙计们帮助我。本机库不是线程安全的,因此在同时分配和释放引用对象时存在问题。