Exception gcroot没有值

Exception gcroot没有值,exception,visual-c++,c++-cli,handle,mixed-mode,Exception,Visual C++,C++ Cli,Handle,Mixed Mode,我对非托管代码中的托管对象有一个奇怪的问题。我有这个C++和CLI模块,它可以连接C++和C代码。我有一个这样的结构: template <class T> struct ManagedReference { gcroot<T^> addonHost; } 现在,在某个时刻,我创建了这个托管引用的一个实例,并设置了addonHost。一切都很好,我能用把手 但是,在某些情况下,可能需要大量的上下文描述,我恐怕无法评估该值: 在这种情况下,使用addonHost调用方

我对非托管代码中的托管对象有一个奇怪的问题。我有这个C++和CLI模块,它可以连接C++和C代码。我有一个这样的结构:

template <class T>
struct ManagedReference
{
  gcroot<T^> addonHost;
}
现在,在某个时刻,我创建了这个托管引用的一个实例,并设置了addonHost。一切都很好,我能用把手

但是,在某些情况下,可能需要大量的上下文描述,我恐怕无法评估该值:

在这种情况下,使用addonHost调用方法会导致找到异常的入口点

从屏幕截图中可以看出,这不是两个不同的实例,而是两个不同的句柄。一模一样。我不明白为什么在某些情况下,价值没有得到评估。也许我怎么能抓住它。因为它不是空的

我还应该提到的是,我有几个gcroot,它们都有这个问题,除了一个是gcroot

更新

以下是调试器在执行期间显示的内容。对象被创建并可用,然后在某个点,值“消失”,在下一次调用时,它仍然存在。但这是非常可复制的。这不是随机的

handle  0x0E1618EC  void*
 value  0x106396d8 { m_host=0x10638e04 }    <-- object is available here

handle  0x0E1618EC  void*
 value  0x1020e558 { m_host=0x1020e4f0 }    <-- object moved in memory

handle  0x0E1618EC  void*
 value                                      <-- no value here

handle  0x0E1618EC  void*
 value  0x1020e558 { m_host=0x1020e4f0 }    <-- object 'is back'

也许初始化gcroot会有帮助。尝试:


只是为了对思想开放,我尝试过,但当然没有帮助。addonHost在创建实例后立即初始化,我可以在大多数情况下使用它的值。@Marius:那么您希望pInstance->addonHost应该始终正确设置,并且在if语句中应该始终计算为true?是的,因为初始化后,这段代码会被调用多次,在某些情况下,找不到值,我不知道如何使用它;但在那之后,下一个电话,它的工作again@Marius:只是调试器的错误行为无法看到值,还是程序有时也会得到错误的结果?gcroot变量和监视表达式存在一些已知的调试器问题;不管我是否使用调试器运行,不管它是Debug还是Release config?Microsoft one有一个_句柄,不是句柄,也没有值。可能存在某些对象类型,调试器无法读取值DLL,这些值是由优化的本机对象编译而成的,调试器无法正确识别这些对象,您检查过吗?@hans,这是Microsoft的gcroot。是的,它有一个_句柄,但是调试器显示了一个句柄和一个值,正如您从屏幕截图中看到的。你当然可以试试看yourself@yochai,如果只是因为调试器没有显示值,我就不会启动这个线程;问题是条件pInstance&&pInstace->addonHost的计算结果为true,因此发生了一个调用,如pInstace->addonHost->CallMethod,然后我得到了找到的异常的入口点。是的,我得到了。你应该检查一下你的自动经验数据
template <class T>
struct ManagedReference
{
  gcroot<T^> addonHost;
  ManagedReference() : addonHost(nullptr) {}
};