Avoid double free in wxComboBox::SetClientObject.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@24640 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -72,11 +72,14 @@ public:
|
||||
|
||||
protected:
|
||||
virtual wxSize DoGetBestSize() const ;
|
||||
|
||||
public: // for wxComboBox only
|
||||
virtual void DoSetItemClientData( int n, void* clientData );
|
||||
virtual void* DoGetItemClientData( int n ) const;
|
||||
virtual void DoSetItemClientObject( int n, wxClientData* clientData );
|
||||
virtual wxClientData* DoGetItemClientObject( int n ) const;
|
||||
|
||||
protected:
|
||||
// free all memory we have (used by Clear() and dtor)
|
||||
// prevent collision with some BSD definitions of macro Free()
|
||||
void FreeData();
|
||||
|
@@ -106,6 +106,8 @@ protected:
|
||||
virtual void DoSetItemClientObject(int n, wxClientData* clientData) ;
|
||||
virtual wxClientData* DoGetItemClientObject(int n) const ;
|
||||
|
||||
void FreeData();
|
||||
|
||||
// the subcontrols
|
||||
wxTextCtrl* m_text;
|
||||
wxChoice* m_choice;
|
||||
|
@@ -414,31 +414,47 @@ int wxComboBox::DoInsert(const wxString& item, int pos)
|
||||
|
||||
void wxComboBox::DoSetItemClientData(int n, void* clientData)
|
||||
{
|
||||
return m_choice->SetClientData( n , clientData ) ;
|
||||
return m_choice->DoSetItemClientData( n , clientData ) ;
|
||||
}
|
||||
|
||||
void* wxComboBox::DoGetItemClientData(int n) const
|
||||
{
|
||||
return m_choice->GetClientData( n ) ;
|
||||
return m_choice->DoGetItemClientData( n ) ;
|
||||
}
|
||||
|
||||
void wxComboBox::DoSetItemClientObject(int n, wxClientData* clientData)
|
||||
{
|
||||
return m_choice->SetClientObject( n , clientData ) ;
|
||||
return m_choice->DoSetItemClientObject( n , clientData ) ;
|
||||
}
|
||||
|
||||
wxClientData* wxComboBox::DoGetItemClientObject(int n) const
|
||||
{
|
||||
return m_choice->GetClientObject( n ) ;
|
||||
return m_choice->DoGetItemClientObject( n ) ;
|
||||
}
|
||||
|
||||
void wxComboBox::FreeData()
|
||||
{
|
||||
if ( HasClientObjectData() )
|
||||
{
|
||||
size_t count = GetCount();
|
||||
for ( size_t n = 0; n < count; n++ )
|
||||
{
|
||||
SetClientObject( n, NULL );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void wxComboBox::Delete(int n)
|
||||
{
|
||||
// force client object deletion
|
||||
if( HasClientObjectData() )
|
||||
SetClientObject( n, NULL );
|
||||
m_choice->Delete( n );
|
||||
}
|
||||
|
||||
void wxComboBox::Clear()
|
||||
{
|
||||
FreeData();
|
||||
m_choice->Clear();
|
||||
}
|
||||
|
||||
|
@@ -414,31 +414,47 @@ int wxComboBox::DoInsert(const wxString& item, int pos)
|
||||
|
||||
void wxComboBox::DoSetItemClientData(int n, void* clientData)
|
||||
{
|
||||
return m_choice->SetClientData( n , clientData ) ;
|
||||
return m_choice->DoSetItemClientData( n , clientData ) ;
|
||||
}
|
||||
|
||||
void* wxComboBox::DoGetItemClientData(int n) const
|
||||
{
|
||||
return m_choice->GetClientData( n ) ;
|
||||
return m_choice->DoGetItemClientData( n ) ;
|
||||
}
|
||||
|
||||
void wxComboBox::DoSetItemClientObject(int n, wxClientData* clientData)
|
||||
{
|
||||
return m_choice->SetClientObject( n , clientData ) ;
|
||||
return m_choice->DoSetItemClientObject( n , clientData ) ;
|
||||
}
|
||||
|
||||
wxClientData* wxComboBox::DoGetItemClientObject(int n) const
|
||||
{
|
||||
return m_choice->GetClientObject( n ) ;
|
||||
return m_choice->DoGetItemClientObject( n ) ;
|
||||
}
|
||||
|
||||
void wxComboBox::FreeData()
|
||||
{
|
||||
if ( HasClientObjectData() )
|
||||
{
|
||||
size_t count = GetCount();
|
||||
for ( size_t n = 0; n < count; n++ )
|
||||
{
|
||||
SetClientObject( n, NULL );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void wxComboBox::Delete(int n)
|
||||
{
|
||||
// force client object deletion
|
||||
if( HasClientObjectData() )
|
||||
SetClientObject( n, NULL );
|
||||
m_choice->Delete( n );
|
||||
}
|
||||
|
||||
void wxComboBox::Clear()
|
||||
{
|
||||
FreeData();
|
||||
m_choice->Clear();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user