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:
Mattia Barbon
2003-11-23 08:17:57 +00:00
parent 8e5ec9cc58
commit f148f2bac3
4 changed files with 45 additions and 8 deletions

View File

@@ -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();

View File

@@ -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;

View File

@@ -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();
}

View File

@@ -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();
}