C++ cli 我应该实现IDisposable to free吗;非托管;记忆?

C++ cli 我应该实现IDisposable to free吗;非托管;记忆?,c++-cli,C++ Cli,假设我正在C++/CLI中实现一些包装类Foo。当然,如果我创建一个dtor(Foo::~Foo),它将成为一个IDisposable实现 IDisposable通常用于允许立即释放一些“稀缺”资源:GDI资源、文件句柄等。但是,如果我的IDisposable只是释放内存(例如,它只是执行free或delete),那么无论何时,它不应该在常规终结器(Foo::!Foo)中完成吗 我的意思是,我们同意.NET可以随时释放内存的想法,那么为什么要对本质上只是释放内存的东西进行粒度控制呢?我个人认为,

假设我正在C++/CLI中实现一些包装类
Foo
。当然,如果我创建一个dtor(
Foo::~Foo
),它将成为一个
IDisposable
实现

IDisposable通常用于允许立即释放一些“稀缺”资源:GDI资源、文件句柄等。但是,如果我的IDisposable只是释放内存(例如,它只是执行
free
delete
),那么无论何时,它不应该在常规终结器(
Foo::!Foo
)中完成吗


我的意思是,我们同意.NET可以随时释放内存的想法,那么为什么要对本质上只是释放内存的东西进行粒度控制呢?

我个人认为,尽早释放内存(即在不需要时尽快释放内存)是一个好原则。 当然,GC最终会启动并释放它。但是GC使用单个线程来调用所有终结器,如果要调用的终结器太多,这可能会对性能产生不良影响


对于一个只有一个客户端的桌面应用程序,你可能感觉不到有多大区别,但想象一下一个有数百或数千个客户端的服务器应用程序。

就我个人而言,我认为尽早(即在你不需要时)释放内存是一个好原则。 当然,GC最终会启动并释放它。但是GC使用单个线程来调用所有终结器,如果要调用的终结器太多,这可能会对性能产生不良影响


对于一个只有一个客户端的桌面应用程序,您可能感觉不到有多大区别,但想象一下一个有数百或数千个客户端的服务器应用程序。

但是您不希望对托管.NET对象的解除分配有同样的控制,那么为什么要对非托管对象进行解除分配呢?对于.NET程序来说,托管对象可能是其分配的大部分,并且您不会“在不需要它们时”释放它们。但是您不希望对托管.NET对象的释放具有相同的控制,那么为什么要对非托管对象进行释放呢?对于.NET程序来说,托管对象可能是其大部分分配,并且您不会“在不需要它们时”立即释放它们。