Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用内部类中的方法而不使用new关键字进行对象初始化是否会导致C#Winforms中的内存泄漏_C#_Winforms_Memory Leaks_New Operator - Fatal编程技术网

使用内部类中的方法而不使用new关键字进行对象初始化是否会导致C#Winforms中的内存泄漏

使用内部类中的方法而不使用new关键字进行对象初始化是否会导致C#Winforms中的内存泄漏,c#,winforms,memory-leaks,new-operator,C#,Winforms,Memory Leaks,New Operator,我在代码中经常看到以下模式。当用于大量字符串和字符串连接操作(对大小不同的字符串执行数百万次操作)时,是否会导致某种形式的内存泄漏 实现CommonPattern的类如下所示(在深入到与问题相关的代码之后): 我尝试过添加这样的析构函数 ~CommonDesignerPattern() { } 在小项目中调用此代码时,我们没有看到任何问题。然而,在具有150–200个表单的项目中,我们看到了一个重大问题,这导致了内存不足异常 内存分析器没有帮助我找到这个问题。当我进行分析时,它指出字符串和字节

我在代码中经常看到以下模式。当用于大量字符串和字符串连接操作(对大小不同的字符串执行数百万次操作)时,是否会导致某种形式的内存泄漏

实现CommonPattern的类如下所示(在深入到与问题相关的代码之后):

我尝试过添加这样的析构函数

~CommonDesignerPattern() { }
在小项目中调用此代码时,我们没有看到任何问题。然而,在具有150–200个表单的项目中,我们看到了一个重大问题,这导致了内存不足异常

内存分析器没有帮助我找到这个问题。当我进行分析时,它指出字符串字节[]是最后的嫌疑犯,这对我没有帮助

我在一个非常大的项目中做一小部分工作,我想知道上面代码中使用的对new的调用是否会导致内存泄漏,如果是罪魁祸首,我想知道如何解决这个问题


许多在线搜索结果指向EventHandler。但我特别想知道上述情况是否会导致内存泄漏。

您发布的类代码中没有内存泄漏。字符串连接确实会创建额外的字符串实例,但是,一旦这些字符串超出范围,它们最终将被垃圾收集器清除。

Hi John。内存是在应用程序结束时回收的,还是在模式=(newcommonpattern(form)).ToString()的函数结束时回收的;语句?当垃圾收集器运行时,内存将被回收。当内存压力较大时,GC将运行。更多信息请参见:嗨,John Koerner,你能给我推荐一些可以快速释放内存的替代实现吗?如果内存压力很大,那么内存会很快释放。我有一个示例应用程序,我用它来演示VS 2015诊断工具,一旦它开始出现大量内存使用情况,它就会经常调用GC来尝试释放内存。在我的博客上看到更多:我正在VS2010中开发。让我试试VS 2015上的代码,然后回来。顺便说一句,读得不错。写得很好。你反复构造的字符串有多长?它们是否超过42500个字符?那么大的字符串将存储在。分配许多大小相同的字符串可能会导致内存碎片。如果所有与字符串相关的操作都是以这种方式完成的,并且实际上有数百万这样的操作,那么我建议进行研究。在大多数情况下,没有必要这样做,但在这种情况下,不应该忽视这一点。尽管如此,正如前面提到的,这种构造(
new T().ToString()
)不应该导致内存泄漏。我面临的问题需要很长时间才能重现,因此我正在尝试不同的选项。感谢您提供在线信息内容的链接。
internal class CommonPattern {
    private string pattern;
    private TForm form;

    public CommonPattern(TForm form) {
        pattern = pattern + form.Name;
    }

    public override string ToString() {
        return pattern;
    }
}
~CommonDesignerPattern() { }