wxFlatNotebook的内存泄漏

 

快乐虾

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;

     }

}

那么谁来调用这个函数?

void wxFlatNotebook::CleanUp ()

{

    wxFNBRendererMgrST::Free();

}

这个也是个静态函数,从函数名称和wxFNBSingleton<T>::ms_instance这个静态变量可以猜测,在应用程序退出或者不再使用wxFlatNotebook时,应用程序应该主动调用wxFlatNotebook::CleanUp函数来释放内存。

兜了一圈,原来如此!遗憾的是wxFlatNotebook自带的Demo居然也没有在最后调用此函数,因此也有内存泄漏的现象发生!

 

 

参考资料

dll方式编译wxWidgets-2.8.8( 2008-9-6 )

wxWidgetsMFC动态类型信息比较 2008-9-7

wxWidgets程序链接错误解决( 2008-10-24 )

animate示例看wxWidgets的程序结构( 2008-10-25 )

重载wxArtProvider改写wxWidgets图标( 2008-10-25 )

vs2008下使用wxWidgets的诡异问题( 2008-10-28 )

wxWidgests的错误处理( 2008-10-29 )

wxWidgets的资源读取( 2008-11-3 )

wxWidgetsMFC的混用( 2008-11-3 )

wxWidgets菜单上显示图标( 2008-11-3 )

Afxwin.h不能先于wxprec.h包含( 2008-11-4 )

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌云阁主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值