检查.NET句柄的值^

时间:2011-10-03 16:38:02

标签: interop c++-cli mixed-mode handles

这是我的情况:

我在C ++ / CLI层中有.NET包装器对象,它包含指向非托管C ++对象的指针。我已经实现了终结器,以便它删除garbage-collection上的wrapper-object指向的非托管内存,并将指针设置为null。

以下是问题

我正在观看.NET包装器对象的终结器,它会被调用两次并尝试两次删除相同的内存,这表明我已经以某种方式创建了2个超出范围的.NET包装器对象,并且垃圾收集,而我仍然期望包装器对象在范围内(这些包装器对象将传递给VB.NET应用程序)。

这是我的问题:

我有没有检查句柄值,以便我可以确认包装器对象的创建位置(复制或其他)?目前我正在查看句柄值(EG - 0x0014fe80),但是我在创建对象,添加到集合和删除时看到了3个不同的值。所以我不确定GC是否只是移动东西,这是同一个对象,或者我实际上看到3个不同的对象引用相同的非托管内存。如果可能的话,我想解决重复的对象副本,但我知道我可能想要实现某种智能指针,这样就不会发生这种情况。

谢谢, 伊恩

2 个答案:

答案 0 :(得分:1)

看看this question
Here是一个scoped_ptr的实现,它是不可复制的,并且具有非托管对象的自动释放机制,@ Ben Voigt

答案 1 :(得分:0)

是的,我最终修改了一个auto_ptr类作为共享指针,以确保只通过智能指针终结器删除一次非托管内存。我假设我做了类似于所有其他实现的事情;我在auto_ptr模板类中创建了一个静态字典,使用本机指针值作为键,每次调用终结器时都会检查该字典以更新每个项目的计数,或者删除内存。