内存泄漏,大量位图图像 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的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 glfw 窗口上没有使用 opengl 显示位图图像?在 C++ 中读取位图图像文件时出现问题

使用 JNI 和 NDK 旋转位图

在android上调整位图大小的最节省内存的方法?

如何使用 UIImage 加载 16 位图像?

C++:读取位图图像的问题

将位图图像加载到 WINApi C++ 并显示