内存泄漏,大量位图图像 C++ CLI
Posted
技术标签:
【中文标题】内存泄漏,大量位图图像 C++ CLI【英文标题】:Memory leak, numerous bitmap images C++ CLI 【发布时间】:2018-04-05 02:43:44 【问题描述】:我遇到内存不足错误。我在图片处理应用中有一个表格。
以下是来自 void 例程的相关代码部分:
Image^ CurrentImage;
Image^ ProcessedImage;
for(int i=0; i<NumSourceFiles; i++)
CurrentImage = Image::FromFile(File[i]);
ProcessedImage = ProcessImage(CurrentImage, ShrinkToWidth, ShrinkToHeight, Rectangle(LeftOrigin,TopOrigin,CropWidth,CropHeight));
NumFiles++; //increment to get next number to save
NextFileName = folderName_specific+"\\"+SelectedCondition+"_"+Convert::ToString(NumFiles)+".jpg";
ProcessedImage->Save(NextFileName, ImageFormat::Jpeg);
delete CurrentImage;
delete ProcessedImage;
现在是 ProcessImage 例程:
private: Image^ ProcessImage(Image^ img, int width, int height, Rectangle cropArea) //shrink and crop
Bitmap^ bmpImage = gcnew Bitmap(img);
bmpImage = bmpImage->Clone(cropArea, bmpImage->PixelFormat);
Bitmap^ bmpImage1 = gcnew Bitmap(bmpImage, width, height);
delete bmpImage;
return bmpImage1;
如果我去掉所有的删除语句,那么它会在内存不足之前处理大约 200 张图像。如果我删除 void 例程中的两个删除语句,它将处理大约 300 个。如果我将它们全部保留在其中,它将在内存不足故障之前执行大约 500 个图像。它总是在 ProcessImage 例程的第一条语句处失败。
我尝试将 bmpImage1 设为全局变量并在 void 例程中将其删除,但这并没有帮助。知道我在哪里建立记忆吗?
2018 年 4 月 12 日更新: 我将其简化如下(将其全部卡在 for/next 循环中),并且在保存 550 张左右的图片后它仍然会耗尽内存。难倒......真的需要解决这个问题...... Lil'帮助? (请在上面加糖!)
for(int i=0; i<NumSourceFiles; i++)
Image^ CurrentImage = Image::FromFile(File[i]);
NumFiles++; //increment to get next number to save
NextFileName = folderName_specific+"\\"+SelectedCondition+"_"+Convert::ToString(NumFiles)+".jpg";
Bitmap^ bmpImage = gcnew Bitmap(CurrentImage);
bmpImage = bmpImage->Clone(Rectangle(LeftOrigin,TopOrigin,CropWidth,CropHeight), bmpImage->PixelFormat);
Image^ ProcessedImage = gcnew Bitmap(bmpImage, ShrinkToWidth, ShrinkToHeight);
ProcessedImage->Save(NextFileName, ImageFormat::Jpeg);
delete bmpImage;
delete ProcessedImage;
delete CurrentImage;
【问题讨论】:
【参考方案1】:通过在三个delete语句之后添加这两个语句来解决它:
GC::Collect(); GC::WaitForPendingFinalizers();
您必须按此顺序使用这两个语句。消除了内存泄漏。
【讨论】:
以上是关于内存泄漏,大量位图图像 C++ CLI的主要内容,如果未能解决你的问题,请参考以下文章