我想问一下这个使用模式SuppressFinalize。假设我有一个Foo存储某种资源的对象。该对象Foo负责释放分配的资源。我总是使用这种方法:
一个类Foo总是使用释放资源的内部方法来实现finalize和方法。dispose调用时dispose,我总是调用SuppressFinalize该方法(为了优化垃圾收集过程——不需要将此对象存储在终结队列中,或者,例如,如果我忘记显式调用dispose该方法)。
这种方法有什么performance缺点吗?我不明白这种方法是否会产生任何“副作用”——例如,gc此类对象将始终放置在终结队列中
更新:用法示例(用 C++/Cli 编写 -CleanResources未使用复选框,因为没有托管字段)
NativeWrapper::NativeWrapper(void) :
m_native(new Native())
{
}
NativeWrapper::~NativeWrapper(void)
{
CleanResources();
System::GC::SuppressFinalize(this);
}
NativeWrapper::!NativeWrapper(void)
{
CleanResources();
}
void NativeWrapper::CleanResources(void)
{
delete m_native;
}
我没有看到任何性能方面的缺点。唯一的缺点是
IDisposable它必须是幂等的,即必须可以调用Dispose两次。对于您来说,这目前会导致双重释放内存,因此添加标志也是有意义的isDisposed。即使你在你的代码中使用
using,客户端仍然可以随时调用GC.ReRegisterForFinalize,这将导致调用Finalize后仍然发生Dispose。(此处提供了对实现的详细概述
IDisposable,包括自定义包装器。)