【问题标题】:C# multiple inheritance with interfaces and memory leaks带有接口和内存泄漏的 C# 多重继承
【发布时间】:2015-11-14 15:22:51
【问题描述】:

我正在编写一个 C# 程序,其中我有一个继承多个接口的类,如下所示

 class MyClass:IMyInterface,IExampleInterface,IDisposable
 {
 }

但是 IMyInterface 或 IExampleInterface 都不是单独继承 IDisposable 的。但是当我创建一个接口的实例时,例如

  IMyInterfacce myInterface = new MyClass();

并分析我的代码(使用 Coverity 工具)我发现存在资源泄漏并且对象 myInterface 没有释放它在内存中持有的资源。 虽然我正在使用 new MyClass() 实例化 MyClass 实例,但 IMyInterface 并没有实现 IDisposable 虽然 MyClass 实现。

那么,就“myInterface”对象而言,我到底为什么会抱怨资源泄漏/内存泄漏。

非常欢迎任何建议。

【问题讨论】:

  • IMyInterface 只是一个接口,它没有实现,它基本上是一个代码合同,所以它不能保存内存。无论你的实现是做什么的。
  • 如果MyClass的任何接口有impl IDisposable,你为什么要尝试在MyClass中实现呢?而如果IMyInterfacce不是impl IDisposable,但是你使用IMyInterfacce myInterface = new MyClass();,你不能dispose你的对象,你需要使用类型转换。
  • @Ron 你是绝对正确的,IMyInterface 没有实现所以不能保存内存。但是当我实例化 IMyInterface myInterface = new MyClass();这就是 myInterface 占用内存空间并且在代码超出范围后不会释放它的时候。
  • @user2913184 IDisposable 不会自动释放资源,它只会在您显式调用Dispose 或在调用Disposeusing 语句中使用它时释放它们。

标签: c# .net


【解决方案1】:

当您创建一个类并将其分配给一个接口时,您仍然创建了该类类型的一个实例。

IMyInterfacce myInterface = new MyClass();

仍然创建一个MyClass 对象,myInterface 引用一个MyClass 对象。所以myInterface 仍然引用了一个需要处理的类的实例。

完成后,您必须将其转回并调用Dispose

((IDisposable)myInterface).Dispose();
// Or
((MyClass)myInterface).Dispose();

或者您可以将其包装在 using 语句中:

using (MyClass myClass = new MyClass()) {
    MyInterface myInterface = myClass;
}

【讨论】:

  • @shf301我想这绝对是我想要的。非常感谢朋友。
  • @user2913184 如果您觉得这有帮助,请将问题标记为已回答。
猜你喜欢
  • 2020-06-23
  • 2011-10-04
  • 2013-03-31
  • 2011-03-02
  • 2012-12-14
  • 1970-01-01
  • 2022-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多