在位图上绘制时抛出 OutOfMemory 异常

OutOfMemory exception thrown while drawing on bitmap

我已经在图形软件上工作了几个月,现在快完成了。唯一的问题是我在 Bitmap

上绘图时不断遇到奇怪的 OutOfMemory 异常

首先,我声明一个全局位图变量(没有实例化),我将在其上绘制笛卡尔平面和图形。完成后,我会将其设置为窗体上 PictureBox 的图像。

Private bmp As Bitmap 

一旦用户输入要绘制的函数,我将调用一个过程,在该过程中我首先实例化 Bitmap 变量,然后创建一个我将用于调用 Draw 过程的 Graphics 对象:

bmp = New Bitmap(PictureBox1.Width, PictureBox1.Height)
Dim G As Graphics = Graphics.FromImage(bmp)

完成此操作后,我将调用一个循环结构,该结构将计算输入函数的点,并将它们存储在我将在 DrawCurve 函数中使用的 Point 对象数组中。

Dim pts() As Point
.
.
<loop here>
.
.
G.DrawCurve(New Pen(...), pts)

如果检测到渐近线,则退出循环并继续绘制到目前为止已经计算出的图形部分,然后returns到循环的开头并在渐近线之后继续向前.我已经在几个具有大量渐近线(例如 tan[x])的图表上对此进行了测试,并且效果很好。但是,我尝试绘制的一张图表引发了异常。如果有帮助,那就是 "sin(x^log(x))^tan(x)"。该图本身有一些渐近线,在绘制了大约 3 或 4 个线段后,它在尝试执行 DrawCurve 过程时抛出 OutOfMemory 异常

G.DrawCurve(New Pen(...), pts) 'OutOfMemory exception thrown

我已经检查过,应用程序使用的 RAM 不到 25 MB,大约有 10 个左右的 GDI 对象,句柄不多。我不明白 OutOfMemory 异常是从哪里来的。一切都井井有条,我应该指出,更复杂的图形,甚至更多的渐近线都运行良好。我已经尝试了所有方法,但每次都会抛出相同的异常。计算机重新启动后是否仍然新鲜或已经 运行 数小时都没有关系。如果我使用某些软件来释放 RAM 也没关系。事实上,它实际上是说还有相当多的内存剩余但是当我尝试在位图上绘制时程序不断抛出 OutOfMemory 异常(到目前为止我提到的一个图正在这样做但我还没有找到任何其他)。我不知道会发生什么。任何人都知道什么可能导致位图上的 DrawCurve 函数引发 OutOfMemory 异常?

原来 OutOfMemory 异常用词不当,因为真正的罪魁祸首是传递给 DrawCurve 函数的参数无效。显然,无法处理仅包含 2 个对象的 Point 数组并抛出异常,混淆地称为 "OutOfMemory".

我还没有执行更多测试并尝试重现错误,但现在,我只是插入了一段代码,在传递它之前检查点数组中至少包含 5 个点到 DrawCurve 函数。整理了乱七八糟的东西,图表出来又漂亮又流畅。

哦,顺便说一句,我在 Visual Studio 2010 年,所以这可能是一个早已修复的错误。无论如何,如果有人不断收到无法追溯到实际资源过度支出的 OutOfMemory 异常,那么很可能是 GDI 对象 运行 进入了它无法识别的异常,只是脱口而出这是内存不足。检查您可能传递的所有参数,您可能会走运