Tho*_*yen 2 c# destructor c++-cli
我有一个混合语言(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());
Run Code Online (Sandbox Code Playgroud)
问题是当C#对象被垃圾收集时,我看到来自C#析构函数的日志语句,但是我没有看到来自C++/CLI对象的日志语句.换句话说,我看到"已销毁的MyC#类对象XXXX"但我没有看到相应的"销毁的MyC++类对象YYYY".
正如我对C#和C++/CLI所理解的那样,析构函数会覆盖GC通常会调用的Finalize()方法,因此当MyC++ Class对象被垃圾回收时,将打印MyC++类析构函数日志语句.
除了MyC++ Class对象被其他东西引用,因此还没有时间用于GC,是否有人知道为什么没有打印MyC++ Class析构函数日志语句?
谢谢,
shf*_*301 11
C++/CLI析构函数与C#finaizlier /析构函数不同.C++/CLR析构函数不会覆盖Finalize(),也不会在垃圾回收期间调用它.C++/CLR有一个不同的语法来声明一个终结器,它将MyC++Class::!MyC++Class在你的情况下.
C++/CLI析构函数相当于IDisposable在C#中实现,实际上实现了IDisposable.要从C#代码调用C++/CLI析构函数,您需要调用该Dispose()方法.这在C++/CLR文档中明确地调用.
| 归档时间: |
|
| 查看次数: |
4194 次 |
| 最近记录: |