Утечка памяти в StringBuilder при использовании Insert () и Clear ()

Мне нужно добавить несколько строк в StringBuilder, где последняя добавленная строка должна быть в начале строки, а самая старая - в конце. Я добавляю новую строку, как это:

stringBuilder.Insert(0, "Some text." + Environment.NewLine);

После этого я очищаю StringBuilder следующим образом:

stringBuilder.Clear();

Я много раз использую один и тот же StringBuilder, что со временем приводит к исключению «Недостаточно памяти».

Я исследовал проблему с тестовой программой ниже, которая показывает, что при использовании Append () и Clear () емкость StringBuilder остается неизменной, независимо от того, сколько раз она используется. Но при использовании Insert () и Clear () емкость StringBuilder продолжает расти. Вот результаты теста:

           stringbuilder.Capacity
Iteration  Append Insert
0:         81984,  78016
1:         81984, 155938
2:         81984, 233860
3:         81984, 311782
4:         81984, 389704
5:         81984, 467626
6:         81984, 545548
7:         81984, 623470
8:         81984, 701392

Эти тестовые данные взяты из тестовой программы ниже. Как можно видеть, независимо от того, сколько раз вы используете Append () и Clear (), емкость не меняется. Но он продолжает расти при использовании Insert () и Clear ().

Вопрос: Правильно ли говорить, что StringBuilder имеет утечку памяти при использовании Insert () и Clear (), потому что Capacity продолжает расти, и это в конечном итоге приводит к исключению Out Of Memory?

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

Если это действительно следует считать утечкой памяти, как мне сообщить об этом в Microsoft?

using System;
using System.Text;

namespace TestStringBuilder {
  class Program {
    static void Main(string[] args) {
      StringBuilder stringBuilderAppend = new StringBuilder();
      StringBuilder stringBuilderInsert = new StringBuilder();
      string capacityGrow = "";
      for (int outerIndex = 0; outerIndex < 9; outerIndex++) {
        for (int innerIndex = 0; innerIndex < 1000; innerIndex++) {
          stringBuilderAppend.Append("Just some text to fill stringbuffer with 01234567890qwertyuiopasdfghjklzxcvbnm");
          stringBuilderInsert.Insert(0, "Just some text to fill stringbuffer with 01234567890qwertyuiopasdfghjklzxcvbnm");
        }
        stringBuilderAppend.Clear();
        stringBuilderInsert.Clear();
        capacityGrow += outerIndex + ": " + stringBuilderAppend.Capacity + ", " + stringBuilderInsert.Capacity  + Environment.NewLine;
      }
      //check in the debugger capacityGrow to see the capacity used in each iteration
      System.Diagnostics.Debugger.Break();
    }
  }
}

Edit1: После еще нескольких поисков я нашел предложение установить Capacity равным 0 после Clear (), вот так:

stringBuilder.Clear();
stringBuilder.Capacity = 0;

Это предотвращает утечку памяти и возникающее исключение «Недостаточно памяти» при многократном использовании Insert (), но также устраняет цель повторного использования StringBuilder, которая заключается в предотвращении выделения и освобождения памяти для достижения более высокой скорости. Вместо того чтобы установить Capacity = 0, можно было бы просто использовать новый StringBuilder вместо Clear ().

Похоже, что Insert () не использует повторно неиспользуемую память, назначенную уже StringBuilder, но продолжает добавлять новую память, несмотря на Clear (). Я все еще чувствую, что это ошибка, потому что, кто ожидал бы исчерпать память, несмотря на очистку StringBuilder? Буду признателен за некоторые комментарии, если это ошибка, и если об этом следует сообщить в Microsoft.

Edit2: Я сообщил об ошибке в Microsoft:https://connect.microsoft.com/VisualStudio/feedback/details/1242873

Пожалуйста, перейдите по ссылке и подтвердите ошибку, иначе я боюсь, что Microsoft не будет смотреть на нее :-(

Заключительные замечания:

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

Из предыдущих публикаций я узнал, что комментаторы любят отмечать вопрос как «На этот вопрос уже есть ответ», просто потому, что они не понимают разницу между моим вопросом и другими вопросами. Действительно, есть много ответов на вопросы о stackoverlow для StringBuilder и Out of Memory. Я прочитал все, что я мог найти с Google или Stackoverlow. Они о APPEND () и очень длинных текстах. Они не о Insert (). Обратите внимание, что мои проблемы возникают даже с очень короткими строками и только при использовании Insert (), но не при использовании Append ()!

Из предыдущих публикаций я узнал, что комментаторы любят предлагать использовать другое программирование, например, избегать использования Insert () и решать проблему с помощью Append и добавлять строки в перевернутой последовательности. Хотя это может быть возможно в некоторых случаях, я считаю, что Insert () и Clear () должны работать правильно, и мы должны сообщить Microsoft, если есть проблема.

Ответы на вопрос(2)

Ваш ответ на вопрос