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:
|
protected:
|
||||||
virtual wxSize DoGetBestSize() const ;
|
virtual wxSize DoGetBestSize() const ;
|
||||||
|
|
||||||
|
public: // for wxComboBox only
|
||||||
virtual void DoSetItemClientData( int n, void* clientData );
|
virtual void DoSetItemClientData( int n, void* clientData );
|
||||||
virtual void* DoGetItemClientData( int n ) const;
|
virtual void* DoGetItemClientData( int n ) const;
|
||||||
virtual void DoSetItemClientObject( int n, wxClientData* clientData );
|
virtual void DoSetItemClientObject( int n, wxClientData* clientData );
|
||||||
virtual wxClientData* DoGetItemClientObject( int n ) const;
|
virtual wxClientData* DoGetItemClientObject( int n ) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
// free all memory we have (used by Clear() and dtor)
|
// free all memory we have (used by Clear() and dtor)
|
||||||
// prevent collision with some BSD definitions of macro Free()
|
// prevent collision with some BSD definitions of macro Free()
|
||||||
void FreeData();
|
void FreeData();
|
||||||
|
@@ -106,6 +106,8 @@ protected:
|
|||||||
virtual void DoSetItemClientObject(int n, wxClientData* clientData) ;
|
virtual void DoSetItemClientObject(int n, wxClientData* clientData) ;
|
||||||
virtual wxClientData* DoGetItemClientObject(int n) const ;
|
virtual wxClientData* DoGetItemClientObject(int n) const ;
|
||||||
|
|
||||||
|
void FreeData();
|
||||||
|
|
||||||
// the subcontrols
|
// the subcontrols
|
||||||
wxTextCtrl* m_text;
|
wxTextCtrl* m_text;
|
||||||
wxChoice* m_choice;
|
wxChoice* m_choice;
|
||||||
|
@@ -414,31 +414,47 @@ int wxComboBox::DoInsert(const wxString& item, int pos)
|
|||||||
|
|
||||||
void wxComboBox::DoSetItemClientData(int n, void* clientData)
|
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
|
void* wxComboBox::DoGetItemClientData(int n) const
|
||||||
{
|
{
|
||||||
return m_choice->GetClientData( n ) ;
|
return m_choice->DoGetItemClientData( n ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxComboBox::DoSetItemClientObject(int n, wxClientData* clientData)
|
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
|
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)
|
void wxComboBox::Delete(int n)
|
||||||
{
|
{
|
||||||
|
// force client object deletion
|
||||||
|
if( HasClientObjectData() )
|
||||||
|
SetClientObject( n, NULL );
|
||||||
m_choice->Delete( n );
|
m_choice->Delete( n );
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxComboBox::Clear()
|
void wxComboBox::Clear()
|
||||||
{
|
{
|
||||||
|
FreeData();
|
||||||
m_choice->Clear();
|
m_choice->Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -414,31 +414,47 @@ int wxComboBox::DoInsert(const wxString& item, int pos)
|
|||||||
|
|
||||||
void wxComboBox::DoSetItemClientData(int n, void* clientData)
|
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
|
void* wxComboBox::DoGetItemClientData(int n) const
|
||||||
{
|
{
|
||||||
return m_choice->GetClientData( n ) ;
|
return m_choice->DoGetItemClientData( n ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxComboBox::DoSetItemClientObject(int n, wxClientData* clientData)
|
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
|
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)
|
void wxComboBox::Delete(int n)
|
||||||
{
|
{
|
||||||
|
// force client object deletion
|
||||||
|
if( HasClientObjectData() )
|
||||||
|
SetClientObject( n, NULL );
|
||||||
m_choice->Delete( n );
|
m_choice->Delete( n );
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxComboBox::Clear()
|
void wxComboBox::Clear()
|
||||||
{
|
{
|
||||||
|
FreeData();
|
||||||
m_choice->Clear();
|
m_choice->Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user