MFC-单例模式内存泄露有关问题
MFC---单例模式内存泄露问题
在VS2005环境下,用MFC编写的多线程程序,需要读取配置文件,所以用单例模式设计,结果有内存泄露的情况,具体如下:
头文件:
class CConfig
{
public:
virtual ~CConfig(void);
private:
CConfig(void);
static CConfig * m_pInstance;
public:
static CConfig* GetInstance();
//其他函数
}
cpp文件:
CConfig * CConfig::m_pInstance = NULL;
CConfig::CConfig(void)
{
}
CConfig::~CConfig(void)
{
if ( m_pInstance != NULL )
delete m_pInstance;
}
CConfig* CConfig::GetInstance()
{
if ( m_pInstance == NULL ) //判断是否第一次调用
m_pInstance = new CConfig();
return m_pInstance;
}
在输出窗口查看:
Detected memory leaks!
Dumping objects ->
{273} normal block at 0x0021FB30, 36 bytes long.
Data: < > DC 82 8A 00 09 00 00 00 09 00 00 00 01 00 00 00
{68} normal block at 0x00218D00, 42 bytes long.
Data: < > DC 82 8A 00 0C 00 00 00 0C 00 00 00 01 00 00 00
e:\gas\config.cpp(43) : {67} normal block at 0x00218CC8, 12 bytes long.
Data: < x ! @ ! > B8 B0 78 00 10 8D 21 00 40 FB 21 00
Object dump complete.
哪位大牛指点一下啊,不胜感激!小弟新手,望详细说明解决办法
------解决方案--------------------
类的构造使用了保护/私有模式,类不能创建在栈中,因此默认的构析函数将不被调用
new的对象创建在堆中,必须调用delete释放
------解决方案--------------------
这个static的CConfig指针没有被删除,所以内存泄露。
这个指针只需要被删除一次,所以在App的InitInstance末尾 或者 App的析构函数中delete都可以。
不要放在对话框中delete,除非这个对话框是主对话框。
------解决方案--------------------
对象指针只有在delete指针的时候才会调用对象的析构函数
在VS2005环境下,用MFC编写的多线程程序,需要读取配置文件,所以用单例模式设计,结果有内存泄露的情况,具体如下:
头文件:
class CConfig
{
public:
virtual ~CConfig(void);
private:
CConfig(void);
static CConfig * m_pInstance;
public:
static CConfig* GetInstance();
//其他函数
}
cpp文件:
CConfig * CConfig::m_pInstance = NULL;
CConfig::CConfig(void)
{
}
CConfig::~CConfig(void)
{
if ( m_pInstance != NULL )
delete m_pInstance;
}
CConfig* CConfig::GetInstance()
{
if ( m_pInstance == NULL ) //判断是否第一次调用
m_pInstance = new CConfig();
return m_pInstance;
}
在输出窗口查看:
Detected memory leaks!
Dumping objects ->
{273} normal block at 0x0021FB30, 36 bytes long.
Data: < > DC 82 8A 00 09 00 00 00 09 00 00 00 01 00 00 00
{68} normal block at 0x00218D00, 42 bytes long.
Data: < > DC 82 8A 00 0C 00 00 00 0C 00 00 00 01 00 00 00
e:\gas\config.cpp(43) : {67} normal block at 0x00218CC8, 12 bytes long.
Data: < x ! @ ! > B8 B0 78 00 10 8D 21 00 40 FB 21 00
Object dump complete.
哪位大牛指点一下啊,不胜感激!小弟新手,望详细说明解决办法
------解决方案--------------------
类的构造使用了保护/私有模式,类不能创建在栈中,因此默认的构析函数将不被调用
new的对象创建在堆中,必须调用delete释放
class CConfig
{
protected:
virtual ~CConfig(void);
CConfig(void);
static CConfig * m_pInstance;
public:
static CConfig* GetInstance();
static void destory();
//其他函数
};
CConfig * CConfig::m_pInstance = NULL;
CConfig::CConfig(void)
{
}
CConfig::~CConfig(void)
{
}
CConfig* CConfig::GetInstance()
{
if ( m_pInstance == NULL ) //判断是否第一次调用
m_pInstance = new CConfig();
return m_pInstance;
}
void CConfig::destory()
{
if(m_pInstance)
{
delete m_pInstance;
m_pInstance = NULL;
}
}
CConfig* pTest = CConfig::GetInstance(); //创建
CConfig::destory(); //销毁
------解决方案--------------------
这个static的CConfig指针没有被删除,所以内存泄露。
这个指针只需要被删除一次,所以在App的InitInstance末尾 或者 App的析构函数中delete都可以。
不要放在对话框中delete,除非这个对话框是主对话框。
------解决方案--------------------
对象指针只有在delete指针的时候才会调用对象的析构函数