快乐虾
http://blog.csdn.net/lights_joy/
本文适用于
wxWidgets-2.8.8
vs2008
Windows XP
欢迎转载,但请保留作者信息
在使用wxFlatNotebook时发生一个很奇怪的内存泄漏:
m_pNotebook = new ::wxFlatNotebook(this, wxID_nbMain);
delete m_pNotebook;
即使这样的代码,依然会有内存泄漏。
看了一个wxFlatNotebook的构造函数,发现只要一创建wxPageContainer,就会有内存泄漏,转而怀疑wxPageContainer的问题,试了一下下面的代码:
::wxPageContainer* p = new ::wxPageContainer(this);
delete p;
果然,内存泄漏。看看wxPageContainer的构造函数,并没有发现什么特别的东西,猜测是它的消息处理出了问题,屏蔽wxPageContainer的所有消息处理,再逐个打开,发现在处理WM_ON_SIZE消息时造成了内存泄漏,看看它的代码:
void wxPageContainer::OnSize(wxSizeEvent& WXUNUSED(event))
{
// When resizing the control, try to fit to screen as many tabs as we we can
long style = GetParent()->GetWindowStyleFlag();
wxFNBRendererPtr render = wxFNBRendererMgrST::Get()->GetRenderer(style);
std::vector<wxRect> vTabInfo;
……………
}
范围进一步缩小到wxFNBRendererMgrST::Get()函数,它的代码:
typedef wxFNBSingleton<wxFNBRendererMgr> wxFNBRendererMgrST;
template <typename T>
T* wxFNBSingleton<T>::Get()
{
if(!ms_instance)
ms_instance = new T();
return ms_instance;
}
哈哈,ms_instance是动态分配的,这是个什么东西?
template <typename T>
T* wxFNBSingleton<T>::ms_instance = 0;
原来是个静态变量,那么它是什么时候释放的?
template <typename T>
void wxFNBSingleton<T>::Free()
{
if( ms_instance )
{
delete ms_instance;
ms_instance = 0;
}
}
那么谁来调用这个函数?
voidwxFlatNotebook::CleanUp ()
{
wxFNBRendererMgrST::Free();
}
这个也是个静态函数,从函数名称和wxFNBSingleton<T>::ms_instance这个静态变量可以猜测,在应用程序退出或者不再使用wxFlatNotebook时,应用程序应该主动调用wxFlatNotebook::CleanUp函数来释放内存。
兜了一圈,原来如此!遗憾的是wxFlatNotebook自带的Demo居然也没有在最后调用此函数,因此也有内存泄漏的现象发生!