游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4034|回复: 9

请MFC高手帮忙看下,里面程序有没内存泄露?

[复制链接]

12

主题

88

帖子

188

积分

注册会员

Rank: 2

积分
188
发表于 2009-5-7 11:30:00 | 显示全部楼层 |阅读模式

class CMyFrameWnd : public CFrameWnd
{
public:
        CMyFrameWnd()
        {
                Create(0,_T("Hello World!"));
        }
};

class CMyApp : public CWinApp
{
public:
        virtual BOOL InitInstance( )
        {
                m_pMainWnd = new CMyFrameWnd;
                m_pMainWnd->ShowWindow(SW_SHOW);
                return TRUE;
        }
};
CMyApp        theApp;

以上CMyApp::InitInstance() new 了一个CMyFrameWnd..程序能够运行和处理默认windows消息。
但没有 delete 操作。请问以上程序存在内存泄露吗?
我看到很多资料的第一个MFC程序都是这么写的。 怎么只管 new ,不管 delete 。

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
发表于 2009-5-7 11:49:00 | 显示全部楼层

Re:请MFC高手帮忙看下,里面程序有没内存泄露?

如果有内存泄露, 调试完毕后输出框内会有显示.

7

主题

78

帖子

82

积分

注册会员

Rank: 2

积分
82
发表于 2009-5-7 11:54:00 | 显示全部楼层

Re: 请MFC高手帮忙看下,里面程序有没内存泄露?

jasaczeam: 请MFC高手帮忙看下,里面程序有没内存泄露?


class CMyFrameWnd : public CFrameWnd
{
public:
        CMyFrameWnd()
        {
                Create(0,_T("Hello Wo...

C++里有new必须有delete,这是强制性的,没有delete必然引起内存泄露
所以,请在写下new的之后,立刻写下delete,这是一个好的编程习惯。 [em19]
不过,你还得考虑到mfc封装的名目繁多的各种delete宏 [em2]
再不过,也许是用到了auto_ptr,auto_ptr对象的生命周期结束的时候,动态分配的对象将被自动释放。
最后一个不过,将new和delete配对仍然是好习惯

7

主题

78

帖子

82

积分

注册会员

Rank: 2

积分
82
发表于 2009-5-7 11:57:00 | 显示全部楼层

Re: Re:请MFC高手帮忙看下,里面程序有没内存泄露?

flyue: Re:请MFC高手帮忙看下,里面程序有没内存泄露?

如果有内存泄露, 调试完毕后输出框内会有显示.

mvs自带的debug似乎只能检查reference计数器,对于new/delete是检查不出来滴~~~
至少2003是这样 [em19]

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
发表于 2009-5-7 18:52:00 | 显示全部楼层

Re:请MFC高手帮忙看下,里面程序有没内存泄露?

#include <crtdbg.h>



int main()
{
        _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );


// 这里写你的代码, 你可以试试new之后不释放 运行结束后 看看调试输出框

        _CrtDumpMemoryLeaks();
}

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2009-5-10 12:55:00 | 显示全部楼层

Re:请MFC高手帮忙看下,里面程序有没内存泄露?

没有

2

主题

79

帖子

85

积分

注册会员

Rank: 2

积分
85
QQ
发表于 2009-5-11 11:08:00 | 显示全部楼层

Re: 请MFC高手帮忙看下,里面程序有没内存泄露?


    首先,要理解内存泄露的本质,内存泄露是指运行期内存资源的掉失.但是有例外的情况.

  操作系统对每个进程所占用的系统资源是有记录的,当一个进程退出时,系统会把它所有占用的资源回收.

  所以,并不是用new后要有相对的delete才可以保证不发生内存泄露,这个观点是相对正确的.

  试想一下,一个内存用new申请了后,而没有相应的delete,哪么是不是内存泄露?

  如果你进程一直都在使用这个内存,本质上不属于内存泄露.因为进程退出时,系统也会把它回收,而你的程序一直都在使用着它,并没有掉失.

  所以,MFC有些系统资源并没有提供相应的释放调用,比如全局的窗口句柄之类,但是程序退出时,系统会自动回收,所以并不会发生内存泄露.

   

2

主题

429

帖子

435

积分

中级会员

Rank: 3Rank: 3

积分
435
发表于 2009-5-11 19:44:00 | 显示全部楼层

Re: Re: 请MFC高手帮忙看下,里面程序有没内存泄露?

kissorange: Re: 请MFC高手帮忙看下,里面程序有没内存泄露?


    首先,要理解内存泄露的本质,内存泄露是指运行期内存资源的掉失.但是有例外的情况.

  操作系...


最好还是养成良好的习惯。自己分配的,自己负责释放。

21

主题

112

帖子

118

积分

注册会员

Rank: 2

积分
118
发表于 2009-5-12 10:10:00 | 显示全部楼层

Re:请MFC高手帮忙看下,里面程序有没内存泄露?

不会造成内存泄露。

m_pMainWnd = new CMyFrameWnd;

楼主说的就是这一句嘛。。。
这行代码,在整个程序的生命周期,只运行一次。。。。。。。

程序结束的时候,有操作系统释放相应内存

但是。。。这种写法不好,应该在程序终止的代码中,加入相应的 DELETE 语句比较好。。。

1

主题

11

帖子

23

积分

注册会员

Rank: 2

积分
23
发表于 2009-5-13 17:10:00 | 显示全部楼层

Re:请MFC高手帮忙看下,里面程序有没内存泄露?

不用怕,你这个是框架,在CFrameWnd:estroyWindow内部会通过调用PostNcDestroy(),而PostNcDestroy()内部会调用delete this;释放资源的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 09:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表