不断的new及delete对象或数组会产生内存碎片吗?

lovev8 2010-08-16 05:41:12
类似这样:
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);
...全文
387 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zcchm 2010-08-18
  • 打赏
  • 举报
回复
很多人都会遇到碎片和泄漏问题,推荐一个微软的工具:DebugDiag,能够输出非常详细的内存分析报告。

参考:
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
zcchm 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jianuman 的回复:]

碎片应该有的 不过没啥问题

不是内存泄漏就可以
[/Quote]

内存碎片和泄漏都是问题,严重的时候都会让你抓狂:)
zcchm 2010-08-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 coldmooon 的回复:]

把虚拟地址空间搞成碎片有什么关系?2GB的地址空间?真的不够你折腾?
那你说什么事内存碎片呢,我的理解,就是new了一大堆东西,占了很多页面,又随便delete了其中的大部分,每个页面上都剩余少量的东西,导致整个页不能释放.这种情况操作系统没法做任何的优化.因为要优化就要移动堆中的东西,你的指针就没法用了.解决办法是自己管理堆.不要用FIXED标志,需要的时候lock,用完就unlock.
……
[/Quote]

我是指楼上几位,没特指兄弟你。

不过2G空间真是不够折腾的,64bit下估计才不用担心内存泄漏和碎片问题:)我遇到不止一次内存碎片,每次都是一种折磨。

jianuMan 2010-08-17
  • 打赏
  • 举报
回复
碎片应该有的 不过没啥问题

不是内存泄漏就可以
副组长 2010-08-16
  • 打赏
  • 举报
回复
传说是这样的。
Windows更新了这么多版,这种内存分配和回收的机制已经不知道更新多少回了,已经不清楚了。申请内存太多内存不够是经常的,但是内存太碎搞得大家心碎还没遇到过。用吧,出了问题再说,孩子哭了找他娘。
ColdMooon 2010-08-16
  • 打赏
  • 举报
回复
把虚拟地址空间搞成碎片有什么关系?2GB的地址空间?真的不够你折腾?
那你说什么事内存碎片呢,我的理解,就是new了一大堆东西,占了很多页面,又随便delete了其中的大部分,每个页面上都剩余少量的东西,导致整个页不能释放.这种情况操作系统没法做任何的优化.因为要优化就要移动堆中的东西,你的指针就没法用了.解决办法是自己管理堆.不要用FIXED标志,需要的时候lock,用完就unlock.
但是一般没必要.
zcchm 2010-08-16
  • 打赏
  • 举报
回复
不同意楼上对内存碎片的理解。

内存碎片一般是由于分配了大量生存周期较长的堆内存,这些内存会把虚拟地址空间搞成碎片,无法分配较大尺寸的内存,这种情况发生时,称之为内存碎片。

当堆内存释放时,相邻的两片内存会合并成一块较大的;如果堆内存得到及时释放,并不会产生内存碎片,只是频繁的申请、释放会导致系统性能下降而已。
ColdMooon 2010-08-16
  • 打赏
  • 举报
回复
物理内存是分页的.
bitmap这样的大对象(好像)是整页整页的分配的.一旦释放不会留下任何痕迹.
堆中的CBitmap对象很小,但尺寸统一.后续的分配极大可能会重用先前释放的地址.几乎不会产生碎片.
arong1234 2010-08-16
  • 打赏
  • 举报
回复
碎片不一定有机会回收和整理的[Quote=引用 1 楼 wltg2001 的回复:]
应该是会的,不过系统应该会在合适的时候进行回收,整理
[/Quote]
cwwql 2010-08-16
  • 打赏
  • 举报
回复
我觉得会产生内存碎片,并且delete释放的内存系统也不是刚释放就收回,而是等到他用到的时候统一收回。
wltg2001 2010-08-16
  • 打赏
  • 举报
回复
应该是会的,不过系统应该会在合适的时候进行回收,整理

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧