使用来自内部 类 的方法而不使用 new 关键字进行对象初始化会导致 C# Winforms 中的内存泄漏
Does using methods from internal classes without object initialization using new keyword cause memory leak in C# Winforms
我经常看到代码中使用了以下模式。当用于大量字符串和字符串连接操作(对不同大小的字符串进行数百万次操作)时,这是否会导致某种形式的内存泄漏。
pattern = (new CommonPattern(form)).ToString();
实现 CommonPattern 的 class 看起来像这样(在归结为与问题相关的代码之后):
internal class CommonPattern {
private string pattern;
private TForm form;
public CommonPattern(TForm form) {
pattern = pattern + form.Name;
}
public override string ToString() {
return pattern;
}
}
我试过像这样添加析构函数。
~CommonDesignerPattern() { }
在小型项目中调用此代码时,我们没有发现任何问题。然而,在具有 150 – 200 个表单的项目中,我们发现了重大问题——导致内存不足异常。
内存分析器没有帮助我找到这个问题。当我做分析时,它指向 String 和 byte[] 作为最终的嫌疑人,这对我没有帮助。
我从事一个非常大的项目的一小部分工作,想了解上面代码中使用的对 new 的调用是否会导致内存泄漏,并了解如果它是罪魁祸首如何解决。
很多在线搜索结果都指向 EventHandlers。但具体我想知道上面的情况是否会导致内存泄漏。
您发布的 class 代码中没有内存泄漏。字符串连接确实会创建额外的字符串实例,但是,一旦这些字符串超出范围,它们最终将被垃圾收集器清除。
我经常看到代码中使用了以下模式。当用于大量字符串和字符串连接操作(对不同大小的字符串进行数百万次操作)时,这是否会导致某种形式的内存泄漏。
pattern = (new CommonPattern(form)).ToString();
实现 CommonPattern 的 class 看起来像这样(在归结为与问题相关的代码之后):
internal class CommonPattern {
private string pattern;
private TForm form;
public CommonPattern(TForm form) {
pattern = pattern + form.Name;
}
public override string ToString() {
return pattern;
}
}
我试过像这样添加析构函数。
~CommonDesignerPattern() { }
在小型项目中调用此代码时,我们没有发现任何问题。然而,在具有 150 – 200 个表单的项目中,我们发现了重大问题——导致内存不足异常。
内存分析器没有帮助我找到这个问题。当我做分析时,它指向 String 和 byte[] 作为最终的嫌疑人,这对我没有帮助。
我从事一个非常大的项目的一小部分工作,想了解上面代码中使用的对 new 的调用是否会导致内存泄漏,并了解如果它是罪魁祸首如何解决。
很多在线搜索结果都指向 EventHandlers。但具体我想知道上面的情况是否会导致内存泄漏。
您发布的 class 代码中没有内存泄漏。字符串连接确实会创建额外的字符串实例,但是,一旦这些字符串超出范围,它们最终将被垃圾收集器清除。