StringBuilder内存不足

时间:2013-08-11 20:10:50

标签: c# string

我正在尝试使用以下字符串对我的解析器进行崩溃测试:

var theWholeUTF8 = new StringBuilder();
for (char code = Char.MinValue; code <= Char.MaxValue; code++)
{
        theWholeUTF8.Append(code);
}

但是,测试在构建字符串时崩溃并抛出OutOfMemoryException。 我错过了什么?

1 个答案:

答案 0 :(得分:11)

问题是code溢出并在0后返回Char.MaxValue。然后for周期不会结束。

尝试

var theWholeUTF8 = new StringBuilder();

for (int code = Char.MinValue; code <= Char.MaxValue; code++)
{
    theWholeUTF8.Append((char)code);
}

说清楚......在某个时刻

code = Char.MaxValue - 1

code++; // code == Char.MaxValue
is code <= Char.MaxValue? Yes
theWholeUTF8.Append((char)code);

code++; // code == 0
is code <= Char.MaxValue? Yes
theWholeUTF8.Append((char)code);

and so on!

一种可能的解决方案是使用code更大的变量。另一种解决方案是:

for (char code = Char.MinValue; code < Char.MaxValue; code++)
{
    theWholeUTF8.Append(code);
}

theWholeUTF8.Append(Char.MaxValue);

我们在code == Char.MaxValue停止,我们手动添加Char.MaxValue

通过在添加之前移动支票获得的其他解决方案:

char code = Char.MinValue;

while (true)
{
    theWholeUTF8.Append(code);

    if (code == Char.MaxValue)
    {
        break;
    }

    code++;
}