c# – C/C++LI:防止非托管资源的托管包装上的垃圾收集
发布时间:2020-12-15 06:44:38 所属栏目:百科 来源:网络整理
导读:我有一个C非管理类NativeDog需要从C#使用,所以我创建了一个包装类ManagedDog. // unmanaged C++ classclass NativeDog{ NativeDog(...); // constructor ~NativeDog(); // destructor ...}// C++/CLI wrapper classref class ManagedDog{ NativeDog* innerOb
我有一个C非管理类NativeDog需要从C#使用,所以我创建了一个包装类ManagedDog.
// unmanaged C++ class class NativeDog { NativeDog(...); // constructor ~NativeDog(); // destructor ... } // C++/CLI wrapper class ref class ManagedDog { NativeDog* innerObject; // unmanaged,but private,won't be seen from C# ManagedDog(...) { innerObject = new NativeDog(...); ... } ~ManagedDog() // destructor (like Dispose() in C#) { // free unmanaged resources if (innerObject) delete innerObject; } !ManagedDog() // finalizer (like Finalize() in C#,in case { // the user forgets to dispose) ~ManagedDog(); // call destructor } } 一切都很好,我使用这样的课程: // in C++/CLI // this function is called from C++ code void MyLibrary::FeedDogNative(NativeDog* nativedog) { ... // (***) } // this function is called from C#,passes on the dog to the native function void MyLibrary::FeedDogManaged(ManagedDog^ dog) { NativeDog* rawdog = dog->innerObject; MyLibrary::FeedDogNative(rawdog); } // C# client code void MyFunc() { ManagedDog dog = new ManagedDog(...); MyLibrary.FeedDogManaged(dog); } 看看有什么问题?我一开始没有,直到很奇怪的事情不时发生.基本上,如果在调用MyFunc()之后,程序被GC暂停,而它位于本机函数FeedDogNative(上面标记(***))的某个位置,则会认为可以收集托管的包装器,因为它将不再被使用,没有在C#MyFunc(它是一个局部变量,不会在FeedDogManaged调用后使用),不在FeedDogManaged中.所以这实际上是发生在场合的. GC调用Finalizer,它会删除本机狗对象,即使FeedDogNative尚未完成使用!所以我的非托管代码现在使用一个已删除的指针. 我该如何防止这种情况?我可以想到一些方法(例如,在FeedDogManaged结束时假装使用狗的虚拟呼叫),但是推荐的方法是什么? 解决方法
您的FeedDogManaged功能需要一个
GC::KeepAlive() 电话.似乎是一个确切的用例.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Flex4 用MXML定义 XML、XMLList、XMLListCollection变量
- oracle查看执行最慢与查询次数最多的sql语句
- React Native 开发日常、常见问题总结及解决
- xml – xsd:dateTime到Java OffsetDateTime
- postgresql – 转义hstore包含JDBC Prepared语句中的运算符
- c# – Winform应用程序的Sharp架构?
- c# – 使用winform或应用程序在客户端上打印
- c# – 在非IEnumerable类型上使用lambda表达式过滤Windows日
- 如何从XML外部攻击中保护javax.xml.transform.TransformerF
- 依赖注入[5]: 创建一个简易版的DI框架[下篇]