Zonciu / Box2DSharp

A C# port of Box2D
MIT License
544 stars 102 forks source link

无法访问已释放的对象 #3

Closed ohsorry closed 5 years ago

ohsorry commented 5 years ago

新建了一个winform工程测试了下Box2DSharp。 关闭窗体退出程序就会报这个错:

System.ObjectDisposedException HResult=0x80131622 Message=无法访问已释放的对象。 ObjectDisposed_ObjectName_Name Source=mscorlib StackTrace: 在 System.Threading.ThreadLocal1.GetValueSlow() 在 System.Threading.ThreadLocal1.get_Value() 在 System.Collections.Concurrent.ConcurrentBag1.GetThreadList(Boolean forceCreate) 在 System.Collections.Concurrent.ConcurrentBag1.Add(T item) 在 Box2DSharp.Common.SimpleObjectPool1.Return(IEnumerable1 items) 在 D:\Pro2019\Box2DSharpPlay\Box2DSharp\Common\ObjectPool.cs 中: 第 88 行 在 Box2DSharp.Collision.DynamicTree.Dispose() 在 D:\Pro2019\Box2DSharpPlay\Box2DSharp\Collision\DynamicTree.cs 中: 第 69 行 在 Box2DSharp.Collision.DynamicTree.Finalize() 在 D:\Pro2019\Box2DSharpPlay\Box2DSharp\Collision\DynamicTree.cs 中: 第 56 行

====================== 代码就new 了一个World,添加了几个body,什么都没做。 退出前手动world.Dispose()也不行。

Zonciu commented 5 years ago

请提供一个可复现的例子

ohsorry commented 5 years ago

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Box2DDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); world = new Box2DSharp.Dynamics.World(new System.Numerics.Vector2(0, -9.8F)); } private Box2DSharp.Dynamics.World world = null; } }

这是我新建的一个工程。 之前的测试碰撞、绘图都OK,就是这个对象池有问题。

Zonciu commented 5 years ago

已更新,请pull最新代码测试一下

ohsorry commented 5 years ago

不报错了,但是你把析构的链给注释掉了,这样行吗

ohsorry commented 5 years ago

等我有时间给你提交代码啊。 可以按参考实现:IDisposable

Zonciu commented 5 years ago

@ohsorry 在Dispose回收即可,析构只应释放非托管资源,这里是之前没考虑全才加进去的,删掉不影响。

ohsorry commented 5 years ago

用了对象池不就相当于用了非托管资源吗,析构里调用Dispose()还是必要的。这样忘了手动Dispose(),可复用对象也能被回收。现在貌似只影响BroadPhase、DynamicTree。