类似这样:
struce imageList
{
CBitmap *bmp;
BOOL isuse;
};void CreateBmp()
{
m_Images = new imageList[300];
for(int i = 0; i < 300; i++)
{
m_Images[i].bmp = new CBitmap;
m_Images[i].bmp->CreateCompatibleBitmap(pDC, 120,120);
}
}void AddImage(imageList *image)
{
int iCnt = int(_msize(m_Images)/sizeof(imageList));
imageList *tmp = new imageList[iCnt + 1];
tmp[iCnt].bmp = image.bmp;
tmp[iCnt].isuse = image.isuse ; for(int i = 0; i < iCnt ; i++)
{
tmp[i].bmp = m_Images[i].bmp;
tmp[i].isuse = m_Images[i].isuse;
}
delete[] m_Images;
m_Images = tmp;
}
UINT DelBmp()
{
int iCnt = int(_msize(m_Images)/sizeof(imageList)); for(int i = 0; i < iCnt; i++)
{
m_Images[i].bmp->DeleteObject();
}
delete[]m_Images;
m_Images = NULL;
}那么不断象下面这样运行会不断产生内存碎片吗?系统会不会自动回收这些碎片?:
CreateBmp();
AddImage(image);
DelBmp();AddImage(image);
AddImage(image);
AddImage(image);DelBmp();
CreateBmp();
AddImage(image);
AddImage(image);
struce imageList
{
CBitmap *bmp;
BOOL isuse;
};void CreateBmp()
{
m_Images = new imageList[300];
for(int i = 0; i < 300; i++)
{
m_Images[i].bmp = new CBitmap;
m_Images[i].bmp->CreateCompatibleBitmap(pDC, 120,120);
}
}void AddImage(imageList *image)
{
int iCnt = int(_msize(m_Images)/sizeof(imageList));
imageList *tmp = new imageList[iCnt + 1];
tmp[iCnt].bmp = image.bmp;
tmp[iCnt].isuse = image.isuse ; for(int i = 0; i < iCnt ; i++)
{
tmp[i].bmp = m_Images[i].bmp;
tmp[i].isuse = m_Images[i].isuse;
}
delete[] m_Images;
m_Images = tmp;
}
UINT DelBmp()
{
int iCnt = int(_msize(m_Images)/sizeof(imageList)); for(int i = 0; i < iCnt; i++)
{
m_Images[i].bmp->DeleteObject();
}
delete[]m_Images;
m_Images = NULL;
}那么不断象下面这样运行会不断产生内存碎片吗?系统会不会自动回收这些碎片?:
CreateBmp();
AddImage(image);
DelBmp();AddImage(image);
AddImage(image);
AddImage(image);DelBmp();
CreateBmp();
AddImage(image);
AddImage(image);
解决方案 »
- combobox下拉事件
- 有没有类似<<深入浅出MFC>>经典级,较新的,mfc的书?侯捷的<<深入浅出MFC>,虽然经典实用,但是不是老了点.
- 关于水晶报表刷新的问题,急~~~~~~~~~
- 新手请教大侠:程序为什么Debug可以,Release却不行?
- 如何用MFC实现局域网内部文件的读写? 急!
- >>>>怎样模拟鼠标双击(左)<<<<<
- 数字转化为字符串的函数是什么?这类函数怎么能找到?
- 有没有谁用过比较好的表格控件
- 如何求一机器共有多少个串口?如COM1,COM2等。
- 谁有 关于 Winamp or 解霸2000 皮肤 的代码 和比较好的文章
- 请问 : 如何枚举任务栏上的窗口句柄,而且顺序是从左至右的顺序
- 关于windows编程 百分号加一个字母(如"%i") 意义
bitmap这样的大对象(好像)是整页整页的分配的.一旦释放不会留下任何痕迹.
堆中的CBitmap对象很小,但尺寸统一.后续的分配极大可能会重用先前释放的地址.几乎不会产生碎片.
那你说什么事内存碎片呢,我的理解,就是new了一大堆东西,占了很多页面,又随便delete了其中的大部分,每个页面上都剩余少量的东西,导致整个页不能释放.这种情况操作系统没法做任何的优化.因为要优化就要移动堆中的东西,你的指针就没法用了.解决办法是自己管理堆.不要用FIXED标志,需要的时候lock,用完就unlock.
但是一般没必要.
Windows更新了这么多版,这种内存分配和回收的机制已经不知道更新多少回了,已经不清楚了。申请内存太多内存不够是经常的,但是内存太碎搞得大家心碎还没遇到过。用吧,出了问题再说,孩子哭了找他娘。
我是指楼上几位,没特指兄弟你。不过2G空间真是不够折腾的,64bit下估计才不用担心内存泄漏和碎片问题:)我遇到不止一次内存碎片,每次都是一种折磨。
http://blogs.msdn.com/b/tess/archive/2008/05/21/debugdiag-1-1-or-windbg-which-one-should-i-use-and-how-do-i-gather-memory-dumps.aspx