从.net代码中销毁非托管对象



我写了一个c++库,它暴露在我的VB中。. NET应用程序通过c++/CLI包装器。

我担心的对象,我穿梭到VB。. NET应用程序通过包装器。为了使用库中的类,我为它们编写了包装器,包装器类包含指向类的非托管实例的指针。在包装器类的析构函数中,我删除了非托管指针所指向的内存。

如果包装的。net库将这些类实例中的一个传递给VB。NET应用程序和VB。. NET应用程序使用它并继续前进(不保存对它的引用);.NET垃圾收集器是否会来处理这个类实例,从而在类的析构函数中释放非托管内存?如果我有对包装类实例所指向的相同内存的引用,这将导致错误。

如果是这种情况,那么我将复制包装器中的所有数据,以确保包装器不与库的本机部分共享任何数据。如果不是这样,那么我是否必须在包装的类实例上调用某种处置方法来销毁非托管对象?

在CLI中,您只需使用析构函数语法(~MyClass()), c++/CLI编译器将在该类上为您创建IDisposable实现。

Dispose方法在非托管代码中调用时,将调用这个"析构函数"(它不是真的,它只是具有语法)。为了释放资源,你可以在这里调用。

如果你想实现终结器,那么你将使用新的析构函数语法(!MyClass())。这应该释放与你在"析构函数"中释放的相同的资源。

最后,在托管代码中,您只需引用IDisposable实现,然后在其上调用Dispose,很可能是通过using语句。

你有点搞混了。是的,在vb.net代码停止引用你的c++/CLI类之后,最终结束器将在对象被收集后被调用。注意,这是终结器,它与dispose无关。c++/CLI对象应该同时提供析构函数(由Dispose()调用)和终结器。

否则没有内存损坏的危险。只有当垃圾收集器找不到对对象的任何活动引用时,才调用终结器。由于没有剩余的引用,因此不可能意外访问已删除的本机对象。

相关内容

  • 没有找到相关文章

最新更新