MFC 内存泄露

linshanxian 2014-07-27 05:21:34
本人新手,正在学习MFC多线程编程。其中用到了CSingleLock(),某位大神给写了一个类,封装了CSingleLock。可是在使用过程中发现了内存泄露问题。使用了visual leak detector定位了内存泄露位置,下面的代码中已有注释。请教诸位大神应如何修改代码。
class SingleLock
{
public:
SingleLock();
~SingleLock();
CSingleLock* getLock();
static SingleLock* getInstance();
private:
CCriticalSection m_CritSection;
CSingleLock* psingleLock;
static SingleLock* m_instance;
};


#include "stdafx.h"
#include "SingleLock.h"

SingleLock* SingleLock::m_instance=NULL;

SingleLock* SingleLock::getInstance()
{
if(m_instance==NULL)
{
m_instance=new SingleLock();//内存泄露
}
return m_instance;
}
SingleLock::SingleLock()
{
psingleLock=new CSingleLock(&m_CritSection);//内存泄露
}

CSingleLock* SingleLock::getLock()
{
return psingleLock;
}

SingleLock::~SingleLock()
{
if(psingleLock!=NULL)
{
delete psingleLock;
}
}
...全文
150 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zilaishuichina 2014-07-28
  • 打赏
  • 举报
回复
linshanxian 2014-07-28
  • 打赏
  • 举报
回复
昨天看了看单例模式的资料,找到了问题的根源。
class SingleLock
{
public:
    ~SingleLock();
    CSingleLock* getLock();
    static SingleLock* getInstance();
private:
    SingleLock();//构造函数必须是私有的
    CCriticalSection m_CritSection;
    CSingleLock* psingleLock;
    static SingleLock* m_instance;
};
整个程序的构造函数不变,析构函数应该是
CTheSecondProgramDlg::~CTheSecondProgramDlg(CWnd* pParent /*=NULL*/)
{
delete SingleLock::getInstance();
}
这样整个程序运行下来就没有内存泄露了。 不知道理解的对不对,反正程序能正常运行了。
xiaohuh421 2014-07-28
  • 打赏
  • 举报
回复
线程安全没有考虑, 如果在多线程场景下使用, 也可能内存泄漏. 并且有getInstance, 肯定就要有release, 不然在哪里释放呢?
linshanxian 2014-07-27
  • 打赏
  • 举报
回复
引用 7 楼 derekrose 的回复:
引用 6 楼 linshanxian 的回复:
[quote=引用 5 楼 derekrose 的回复:] 你确定写这代码的是大神?
相比我的水平来说算是大神,因为他当着我的面不到一分钟就写出来了。现在基本确定是析构函数的问题。
i=new()j;j=new()k;
这样的话,析构函数应该怎么写?
貌似没见过这种写法。。 [/quote] 您能不能帮忙改造一下这个类?
derekrose 2014-07-27
  • 打赏
  • 举报
回复
引用 6 楼 linshanxian 的回复:
引用 5 楼 derekrose 的回复:
你确定写这代码的是大神?
相比我的水平来说算是大神,因为他当着我的面不到一分钟就写出来了。现在基本确定是析构函数的问题。
i=new()j;j=new()k;
这样的话,析构函数应该怎么写?
貌似没见过这种写法。。
linshanxian 2014-07-27
  • 打赏
  • 举报
回复
引用 5 楼 derekrose 的回复:
你确定写这代码的是大神?
相比我的水平来说算是大神,因为他当着我的面不到一分钟就写出来了。现在基本确定是析构函数的问题。
i=new()j;j=new()k;
这样的话,析构函数应该怎么写?
derekrose 2014-07-27
  • 打赏
  • 举报
回复
你确定写这代码的是大神?
lm_whales 2014-07-27
  • 打赏
  • 举报
回复
用智能指针,替换指针实现单例模式
linshanxian 2014-07-27
  • 打赏
  • 举报
回复
忘了说了,整个程序的构造函数和析构函数是这样的。
CTheSecondProgramDlg::CTheSecondProgramDlg(CWnd* pParent /*=NULL*/)
{
SingleLock::getInstance();
}
析构函数这样写
SingleLock::~SingleLock();
提示错误:“SingleLock::~SingleLock”: 非静态成员函数的非法调用
linshanxian 2014-07-27
  • 打赏
  • 举报
回复
引用 1 楼 lisong694767315 的回复:
m_instance是不是也要在析构函数里delete啊

SingleLock::~SingleLock()
{
    if(psingleLock!=NULL)
    {
        delete psingleLock;
    }
   if(m_instance!=NULL)
   {
        delete m_instance;
   }
}
试过了,还是不行
神奕 2014-07-27
  • 打赏
  • 举报
回复
m_instance是不是也要在析构函数里delete啊

SingleLock::~SingleLock()
{
    if(psingleLock!=NULL)
    {
        delete psingleLock;
    }
   if(m_instance!=NULL)
   {
        delete m_instance;
   }
}

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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