首页
社区
课程
招聘
[原创]关于派生类中的CString泄露问题
发表于: 2013-5-23 16:29 5113

[原创]关于派生类中的CString泄露问题

2013-5-23 16:29
5113
#include <afx.h>
//#include <atlstr.h>

class CBase
{
public:
        virtual void Func(){}
};

class CChild :public CBase
{
public:
        CChild(){m_str = _T("");}
private:
        CString m_str;
public:
        virtual void Func(){m_str = _T("腾讯管家你妹刚才为什么报我是木马");}
};

void main()
{
        CBase        *m_pBase = new CChild;
        m_pBase->Func();
        if (NULL != m_pBase)
        {
                delete        m_pBase;
                m_pBase = NULL;
        }
}

编译运行这段程序,发现派生类中的CString会泄露。
Detected memory leaks!
Dumping objects ->
{56} normal block at 0x00B73388, 49 bytes long.
Data: <` d             > 60 AB 64 00 20 00 00 00 20 00 00 00 01 00 00 00

解决方法一:将基类的构造函数虚拟化 即可解决
          virtual ~CBase(){}

解决方法二:将#include <afx.h>换成#include <atlstr.h>即可解决

自我感觉AFX这套东西没有ATL强悍。CString这样也会泄露。好久没发帖了。大家好~

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 517
活跃值: (84)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
2
你用的是基类指针析构,而基类析构函数没有虚化,当然有泄露风险,这个C++已经说过了。
只是你指出的第二个方法就能解决泄露,这是为什么?
2013-5-23 17:33
0
雪    币: 183
活跃值: (1178)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
解决方法1: 虚析构函数。
2013-5-23 17:48
0
雪    币: 31
活跃值: (48)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
解决方法2如何替换呢?修改afxwin.h吗?
2013-5-23 22:44
0
雪    币: 568
活跃值: (308)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
基类没用虚析构函数是有泄露的风险,但是CString封装的好的话 应该不会产生泄露
CString这个类被两个小组封装过
一个是AFX小组(也就是MFC小组)
另外一个小组是ATL小组
这两个小组分别继承了CSimpleStringT做了两个CString类

ATL小组做的类在<atlstr.h>
AFX小组做的类在<afxstr.h>(也就是afx.h)
估计是AFX小组的CString封装的不完善导致了这个时候泄露了。
但是ATL小组的CString此时没有泄露
2013-5-24 10:18
0
雪    币: 568
活跃值: (308)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
估计是AFX小组的CString封装的不完善导致了这个时候泄露了。
但是ATL小组的CString此时没有泄露

不需要改头文件 只要用ATL的CString就不会出现泄露
2013-5-24 10:20
0
雪    币: 143
活跃值: (263)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
7
孩子乖不乖, 父母很关键
2013-5-24 10:32
0
游客
登录 | 注册 方可回帖
返回
//