在几乎完全使用非托管C ++之后第一次编写managed-C ++时,需要注意哪些最常见的问题?
答案 0 :(得分:2)
使用内置的IJW(It Just Works)技术将托管委托转换为指向函数的指针时,指向函数的指针不会保存对委托所来自的对象的引用。如果您不安排以其他方式保存引用,则可能会收集托管对象,然后在调用该函数时,您将获得NullReferenceException。
如果要创建一个需要回调的C库,并且想要将其包装在Managed类中,则会遇到很多问题。托管类的客户端将提供一个委托,您将其转换为回调。您还必须保留对委托或目标对象的引用。
在Managed C ++和C ++ / CLI中也是如此。
答案 1 :(得分:1)
如果您的意思是C ++ / CLI ......
yield
构造,我们在使用TestCaseSource属性生成测试用例数据时使用Nunit编写单元测试时使用了很多。这与下一个有关。答案 2 :(得分:1)
这是另一个问题:在对象上执行方法不构成对象的引用。这意味着在执行成员方法期间,对象可能会在方法仍在执行时清除对象,但在最后一次引用this
对象之后,终结器可能会触发。
如果您的对象具有通过finalization清理的任何非托管状态或包含具有此类非托管状态的任何其他对象,您正在对该非托管状态进行计算,请确保在{{1}上调用GC::KeepAlive
在那些非托管计算之后。我现在倾向于将this
附加到具有非托管计算的所有对象方法。
答案 3 :(得分:0)
一个问题(刚刚得到我):假设“析构函数只能执行一次”。由于析构函数是通过Dispose
调用的,并且Dispose
可能被多次调用,因此这个假设(适用于C ++)不适用于C ++ / CLI。