2016-12-31 9 views
0

Я вижу следующий шаблон, используемый в коде много. Оказывает ли это утечку памяти при использовании для большого количества строк и операций конкатенации строк (миллионы операций с строками разного размера).Использует ли методы из внутренних классов без инициализации объекта с использованием нового ключевого слова вызвать утечку памяти в C# Winforms

pattern = (new CommonPattern(form)).ToString(); 

Класс, реализующий CommonPattern выглядит следующим образом (после кипячения до кода, имеющие отношение к вопросу):

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 [] как последний подозреваемый, который мне не помог.

Я работаю над небольшой частью очень большого проекта и хотел узнать, вызывает ли вызов новый, как он используется в приведенном выше коде, вызывает утечку памяти и узнает, как справиться с этим, если он был виновником.

Результаты поиска в Интернете указывают на EventHandlers. Но в частности, я хочу знать, может ли описанный выше случай привести к утечке памяти.

+1

Как долго строки, которые вы неоднократно строите? Являются ли они более 42 500 символов? Строки, которые большие будут храниться в [большой куче объекта] (http://stackoverflow.com/q/8951836/3744182). Выделение множества строк, размер которых может вызвать фрагментацию памяти. – dbc

+0

Если вся строка, связанная с этим, выполняется таким образом, и есть буквально миллионы таких операций, я бы рекомендовал заглянуть в http://stackoverflow.com/questions/21644658/how-to-use-stringbuilder-wisely , В большинстве случаев нет необходимости [оптимизировать его] (https://blog.codinghorror.com/the-sad-tragedy-of-micro-optimization-theater/), но в этом случае это, вероятно, не следует упускать из виду , Тем не менее, как уже было сказано, такая конструкция ('new T(). ToString()') не должна вызывать утечки памяти. –

+0

проблема, с которой я сталкиваюсь, занимает много времени, чтобы воспроизвести, поэтому я пытаюсь использовать разные варианты. Спасибо за ссылки на информативный контент онлайн. –

ответ

0

В коде кода, который вы опубликовали, отсутствует утечка памяти. Конкатенация строк создает дополнительные экземпляры строк, однако, как только эти строки будут недоступны, они в конечном итоге будут очищены сборщиком мусора.

+0

Привет, Джон. Возвращается ли память в конце приложения или в конце функции, где ** pattern = (новый CommonPattern (form)). Выполняется команда ToString(); **? –

+0

Память будет восстановлена ​​после запуска сборщика мусора. GC будет работать, когда для этого потребуется давление памяти. См. Это для получения дополнительной информации: https://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx#conditions_for_a_garbage_collection –

+0

Привет, Джон Кернер, можете ли вы порекомендовать мне некоторую альтернативную реализацию, которая вызывает быструю освобождение памяти. –