| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 727 人关注过本帖
标题:真不明白, 这几句代码怎么会让占用内存不断增加呢?
只看楼主 加入收藏
zlx345
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-5-4
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
真不明白, 这几句代码怎么会让占用内存不断增加呢?
就是这一个函数, 让程序占用的内存不断增加,请哪位大哥指点一下. 谢谢!
如果这个函数直接返回(什么也不作),则内存正常.
void CClient2Dlg::Invalid(CDC *pDC, CRect rc)    // 以背景颜色使某一区域无效;
{
    //return;
    CBrush *cb,*ocb;
    COLORREF crbackground;
    CPen *pen;
    CPen *oldpen;
    crbackground=0;
    pen=new CPen(PS_SOLID,1,crbackground);
        oldpen=pDC->SelectObject(pen);    cb=new CBrush(crbackground);
    ocb=pDC->SelectObject(cb);
    pDC->Rectangle(&rc);
    delete pen;
    pDC->SelectObject(ocb);
    pDC->SetBkColor(crbackground);
    delete cb;
}

[ 本帖最后由 zlx345 于 2012-5-4 11:47 编辑 ]
搜索更多相关主题的帖子: 内存 void return 
2012-05-04 11:40
ab1034982749
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:215
专家分:1185
注 册:2012-4-14
收藏
得分:5 
因为这个函数里面有对指针进行分配内存的语句。
 pen=new CPen(PS_SOLID,1,crbackground); cb=new CBrush(crbackground);
这两个就是分配内存的语句,而且是动态分配的,既然是动态分配的,就是在程序运行时进行分配。
所以说当程序运行时,函数直接就返回什么都不做,就不会运行分配内存的语句,没有分配内存,
内存就不会被用了,也就不会增加了。
2012-05-05 00:43
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:5 
你这么喜欢动态分配,不去用Java/C#有点亏了,在Java/C#中一切都是指针,而C/C++不提倡

void CClient2Dlg::Invalid(CDC *pDC, CRect rc)    // 以背景颜色使某一区域无效;
{
    COLORREF crbackground = RGB(0,0,0); // 这个还没有初始化下面的代码就开始用了
    CPen pen(PS_SOLID,1,crbackground); // 其实一个空画笔就行了,不需要画笔和画刷同时设为相同颜色
    CPen* oldpen = pDC->SelectObject(&pen);
    CBrush cb(crbackground);
    CBrush* ocb = pDC->SelectObject(cb);

    pDC->Rectangle(&rc);

    pDC->SelectObject(oldpen);
    pDC->SelectObject(ocb);
}
2012-05-05 08:15
lucky563591
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:765
专家分:2103
注 册:2009-11-18
收藏
得分:5 
回复 3楼 rjsp
在Java/C#中一切都是指针,而C/C++不提倡,Java/C#没有指针,是引用,有垃圾回收,真不知道你是怎么学的。
2012-05-05 10:29
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
以下是引用lucky563591在2012-5-5 10:29:11的发言:

在Java/C#中一切都是指针,而C/C++不提倡,Java/C#没有指针,是引用,有垃圾回收,真不知道你是怎么学的。
虽然它不叫指针,但本质上它就是指针,除了几个值类型
我说这话不是想和你争论什么,我的解释只是不希望你的无知误导别人

2012-05-05 16:45
zlx345
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-5-4
收藏
得分:0 
以下是引用ab1034982749在2012-5-5 00:43:05的发言:

因为这个函数里面有对指针进行分配内存的语句。
 pen=new CPen(PS_SOLID,1,crbackground); cb=new CBrush(crbackground);
这两个就是分配内存的语句,而且是动态分配的,既然是动态分配的,就是在程序运行时进行分配。
所以说当程序运行时,函数直接就返回什么都不做,就不会运行分配内存的语句,没有分配内存,
内存就不会被用了,也就不会增加了。

是. 但是在后面都用delete语句删除了啊.

[ 本帖最后由 zlx345 于 2012-5-6 13:26 编辑 ]
2012-05-06 11:42
zlx345
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-5-4
收藏
得分:0 
以下是引用rjsp在2012-5-5 08:15:51的发言:

你这么喜欢动态分配,不去用Java/C#有点亏了,在Java/C#中一切都是指针,而C/C++不提倡

void CClient2Dlg::Invalid(CDC *pDC, CRect rc)    // 以背景颜色使某一区域无效;
{
    COLORREF crbackground = RGB(0,0,0); // 这个还没有初始化下面的代码就开始用了
    CPen pen(PS_SOLID,1,crbackground); // 其实一个空画笔就行了,不需要画笔和画刷同时设为相同颜色
    CPen* oldpen = pDC->SelectObject(&pen);
    CBrush cb(crbackground);
    CBrush* ocb = pDC->SelectObject(cb);

    pDC->Rectangle(&rc);

    pDC->SelectObject(oldpen);
    pDC->SelectObject(ocb);
}

谢谢! 我将用你的这段代码试试, 对比一下运行的效果.
2012-05-06 11:44
zlx345
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-5-4
收藏
得分:0 
试过了,用你的这段代码后, 程序占用内存还是不断增加.
2012-05-06 15:06
BianChengNan
Rank: 8Rank: 8
等 级:贵宾
威 望:13
帖 子:302
专家分:972
注 册:2011-11-30
收藏
得分:0 
以下是引用zlx345在2012-5-4 11:40:21的发言:

就是这一个函数, 让程序占用的内存不断增加,请哪位大哥指点一下. 谢谢!
如果这个函数直接返回(什么也不作),则内存正常.
void CClient2Dlg::Invalid(CDC *pDC, CRect rc)    // 以背景颜色使某一区域无效;
{
    //return;
    CBrush *cb,*ocb;
    COLORREF crbackground;
    CPen *pen;
    CPen *oldpen;
    crbackground=0;
    pen=new CPen(PS_SOLID,1,crbackground);
        oldpen=pDC->SelectObject(pen);    cb=new CBrush(crbackground);
    ocb=pDC->SelectObject(cb);
    pDC->Rectangle(&rc);
    delete pen;
    pDC->SelectObject(ocb);
    pDC->SetBkColor(crbackground);
    delete cb;
}

查一下SelectObject 的用法,貌似最后要再把获得的画刷什么的选回来

我的群:149544757 C/C++/Assembly 喜欢交流的朋友进,进群请写消息
2012-05-09 09:31
快速回复:真不明白, 这几句代码怎么会让占用内存不断增加呢?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.058105 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved