我使用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中是否有可能获得正在运行的程序堆的可视化?