wxFlatNotebook的内存泄漏

来源:互联网 发布:python数据分析 微盘 编辑:程序博客网 时间:2024/04/29 02:50
 

快乐虾

http://blog.csdn.net/lights_joy/

lights@hb165.com

  

本文适用于

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居然也没有在最后调用此函数,因此也有内存泄漏的现象发生!