1

这是我的情况:

我在 C++/CLI 层中有 .NET 包装对象,它保存指向非托管 C++ 对象的指针。我已经实现了终结器,以便它删除垃圾收集上的包装对象指向的非托管内存并将指针设置为空。

这是问题所在

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

这是我的问题:

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

谢谢,伊恩

4

2 回答 2

1

看看这个问题
是一个不可复制的实现,scoped_ptr并且具有非托管对象的自动释放机制,作者:@Ben Voigt

于 2011-10-04T10:02:26.127 回答
0

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

于 2011-10-04T16:33:21.037 回答