我有一个混合语言的应用程序(包括C#,C++/CLI和本地C++),我正在通过在几个对象的构造函数和析构函数中放置日志语句来跟踪一些对象的生命周期。我有一个C#对象,其中包含对C++/CLI对象的引用。
public class MyC#Class
{
public MyC#Class() { log.Debug("created MyC#Class object " + this.GetHashCode()); }
~MyC#Class() { log.Debug("destroyed MyC#Class object " + this.GetHashCode()); }
private MyC++Class myC++Obj = new MyC++Class();
}
MyC++Class::MyC++Class() { loggerInt1(LOGDEBUG, "created MyC++Class object %d", (int)this->GetHashCode());
MyC++Class::~MyC++Class() { loggerInt1(LOGDEBUG, "destroyed MyC++Class object %d", (int)this->GetHashCode());
问题在于当C#对象被垃圾回收时,我能看到来自C#析构函数的日志语句,但是我看不到来自C++/CLI对象的日志语句。换句话说,我看到了“销毁MyC#Class对象XXXX”,但我没有看到相应的“销毁MyC++Class对象YYYY”。据我所知,对于C#和C++/CLI,析构函数会覆盖GC通常调用的Finalize()方法,因此当MyC++Class对象被垃圾回收时,MyC++Class析构函数的日志语句将被打印出来。
除非MyC++Class对象被其他东西引用,因此还未到达GC的时间,否则是否有人知道为什么MyC++Class析构函数的日志语句没有被打印?
谢谢。
MyClass是C#中的Dispose方法。缺少的!MyClass是C#中的析构函数。在任何其他语言和.NET文献中称为终结器。你没有看到MyClass被调用,因为没有人处理该对象。你没有看到!MyClass被调用,因为你没有编写它。 - Hans PassantCppClass
和CsClass
代替C++
和C#
。 - Ben Voigt