避免堆碎片的聪明(?)技巧

时间:2019-02-18 16:11:52

标签: c++ memory constructor heap-memory

我使用C ++进行图像处理,有时由于堆碎片而陷入内存问题(至少我认为碎片是问题所在)

可以说图像类看起来像这样(伪代码)

    Image::Image(fileList): // ImageStack constructor
      nextStackMember_(NULL), 
      fileName_(""),
      intVar1_(0),
//
//
      intVar10_(0);
      bitmap_(NULL)
{
  // Code to initialize all attributes except bitmap_
  // bitmap_ is created from fileName when actually needed
}

有一些成员方法可以转储和加载bitmap_ 如果构造函数在创建时初始化所有成员的bitmap_,我将得到如下堆积的堆:.---.------.--.--------------。等等上 “。”是属性占用的很小的堆空间,“ ---”是位图占用的大的堆空间。 如果堆栈包含-例如-1000张图像,则可以使用所有可用的堆。 如果这样,转储bitmap_可能不会让程序制作新图像,因为所有加载的图像可能都较小。 即使在构建新映像之前,我也会转储所有已加载的映像(通过清空它们的bitmap_,堆将完全碎片化。

现在到“聪明”部分:通过仅在创建堆栈中的每个图像之后加载bitmap_s,我应该得到一个看起来像这样的堆: ...........----------------------------------------- 这样,所有其他属性将紧密地组合到堆中,并且我可以轻松地创建足够大的堆区域,以容纳要创建的任何大小的新映像。

这似乎不像我希望的那样。 我做错了什么或者我完全走错了路?

编辑:visualC中是否有可能获得正在运行的程序堆的可视化?

0 个答案:

没有答案