C++ cli 为什么不';我们不能在析构函数中释放非托管资源吗?

C++ cli 为什么不';我们不能在析构函数中释放非托管资源吗?,c++-cli,C++ Cli,根据本文,在MSDN上,我们应该在终结器中释放非托管资源,在析构函数中释放托管资源。即以下模式: //析构函数\u终结器\u 1.cpp //使用:/clr/c编译 参考结构A{ //析构函数清除所有资源 ~A(){ //清理代码以释放托管资源 // ... //避免代码重复 //调用终结器以释放非托管资源 这个->!A(); } //终结器清理非托管资源 //析构函数或垃圾收集器将 //清理托管资源 !A(){ //清理代码以释放非托管资源 // ... } }; 为什么不把它全部放在析构函

根据本文,在MSDN上,我们应该在终结器中释放非托管资源,在析构函数中释放托管资源。即以下模式:

//析构函数\u终结器\u 1.cpp
//使用:/clr/c编译
参考结构A{
//析构函数清除所有资源
~A(){
//清理代码以释放托管资源
// ...
//避免代码重复
//调用终结器以释放非托管资源
这个->!A();
}
//终结器清理非托管资源
//析构函数或垃圾收集器将
//清理托管资源
!A(){
//清理代码以释放非托管资源
// ...
}
};

为什么不把它全部放在析构函数中,然后废弃终结器呢?是否因为垃圾收集器仍有可能不确定地清理对象?

因为如果跳过析构函数调用(例如,不使用RAII),则非托管资源将泄漏,.NET运行时无法对其进行任何处理

如果在终结器中清理非托管资源,则运行时将运行此操作,即使您将代码弄乱并让对象引用飞到了某个地方:)


基本上,如果您的代码有缺陷,您不能指望调用析构函数,但垃圾收集器回收对象时,将始终调用终结器。

“那么即使您将代码弄乱,让对象引用飞到某个地方,运行时也会运行此程序”。请注意,这并不能保证,只有可能。是的。请始终记住,“空垃圾收集器”是一个有效的实现。(NGC拥有无限的内存,从不费心回收任何东西。)