Memory management 当托管资源未被处置时,什么会导致应用程序在后续启动时崩溃?

Memory management 当托管资源未被处置时,什么会导致应用程序在后续启动时崩溃?,memory-management,native,dispose,unmanaged,drivers,Memory Management,Native,Dispose,Unmanaged,Drivers,我正在开发一个运动跟踪设备的应用程序,发现了一些让我好奇的奇怪行为。设备SDK由三个DLL组成,其中一个(应用程序中使用的主要引用DLL)为非本机DLL,另两个为本机DLL 应用程序有三个主要角色,控制器(设备和应用程序之间的连接)、侦听器(接收跟踪信息)和无休止的帧对象流(侦听器接收的数据)。所有这些物品都是一次性的,我认为它们使用的是非托管资源 如果我不从控制器中删除侦听器,然后处置控制器,则应用程序将在后续启动时崩溃。这种行为是偶发的,可能发生在第二次、第三次或以后的启动中 虽然我正在确定

我正在开发一个运动跟踪设备的应用程序,发现了一些让我好奇的奇怪行为。设备SDK由三个DLL组成,其中一个(应用程序中使用的主要引用DLL)为非本机DLL,另两个为本机DLL

应用程序有三个主要角色,控制器(设备和应用程序之间的连接)、侦听器(接收跟踪信息)和无休止的帧对象流(侦听器接收的数据)。所有这些物品都是一次性的,我认为它们使用的是非托管资源

如果我不从控制器中删除侦听器,然后处置控制器,则应用程序将在后续启动时崩溃。这种行为是偶发的,可能发生在第二次、第三次或以后的启动中

虽然我正在确定我正在处理这些对象,但我仍然很好奇什么样的逻辑或缺乏逻辑会导致这种行为。因为我希望在可执行文件停止运行时处理所有对象

设备驱动程序是否可以保留引用?解决这个问题的最佳方法是什么? 所以问题不是如何处置,而是什么会/可能导致这种情况,为什么会这样,我又该如何处理

更多信息:

  • 没有例外
  • 附加调试器不会提供更多信息

您知道是什么原因导致后续启动时崩溃吗?你有什么例外?如果你找不到,试着去发现。没有例外——什么都没有。附加调试器也没有帮助。你能提供一些关于它在后续启动时在何处/如何崩溃的详细信息吗?我想,侦听器会向驱动程序注册回调,因此当驱动程序准备好新的帧时,它会回调到侦听器中。如果这是真的,那么如果没有从驱动程序中注销侦听器,那么它将保留在内存中,因为驱动程序保持活动状态。如果您再次注册,当您再次启动应用程序时,某些对象仍在从驱动程序接收数据,这可能会导致崩溃,或者注册再次失败,从而使侦听器崩溃。如果它“只是”崩溃,没有任何托管异常,那么崩溃可能在非托管代码中。您可以尝试在连接WinDbg的情况下启动该进程,它肯定会告诉您崩溃的原因。