fix reference counting problems with wxGridCellWithAttr (re-#9567)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54199 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-06-13 21:37:58 +00:00
parent af4d748440
commit 6f292345cf
2 changed files with 27 additions and 13 deletions

View File

@@ -70,6 +70,24 @@ struct wxGridCellWithAttr
wxGridCellWithAttr(int row, int col, wxGridCellAttr *attr_)
: coords(row, col), attr(attr_)
{
wxASSERT( attr );
}
wxGridCellWithAttr(const wxGridCellWithAttr& other)
: coords(other.coords),
attr(other.attr)
{
attr->IncRef();
}
wxGridCellWithAttr& operator=(const wxGridCellWithAttr& other)
{
coords = other.coords;
attr->DecRef();
attr = other.attr;
attr->IncRef();
return *this;
}
~wxGridCellWithAttr()
@@ -79,10 +97,6 @@ struct wxGridCellWithAttr
wxGridCellCoords coords;
wxGridCellAttr *attr;
// Cannot do this:
// DECLARE_NO_COPY_CLASS(wxGridCellWithAttr)
// without rewriting the macros, which require a public copy constructor.
};
WX_DECLARE_OBJARRAY_WITH_DECL(wxGridCellWithAttr, wxGridCellWithAttrArray,
@@ -2597,11 +2611,8 @@ void wxGridCellAttrData::SetAttr(wxGridCellAttr *attr, int row, int col)
}
//else: nothing to do
}
else
else // we already have an attribute for this cell
{
// free the old attribute
m_attrs[(size_t)n].attr->DecRef();
if ( attr )
{
// change the attribute
@@ -2654,8 +2665,6 @@ void wxGridCellAttrData::UpdateAttrRows( size_t pos, int numRows )
else
{
// ...or remove the attribute
// No need to DecRef the attribute itself since this is
// done be wxGridCellWithAttr's destructor!
m_attrs.RemoveAt(n);
n--;
count--;
@@ -2690,8 +2699,6 @@ void wxGridCellAttrData::UpdateAttrCols( size_t pos, int numCols )
else
{
// ...or remove the attribute
// No need to DecRef the attribute itself since this is
// done be wxGridCellWithAttr's destructor!
m_attrs.RemoveAt(n);
n--;
count--;
@@ -3168,7 +3175,8 @@ void wxGridTableBase::SetAttr(wxGridCellAttr* attr, int row, int col)
{
if ( m_attrProvider )
{
attr->SetKind(wxGridCellAttr::Cell);
if ( attr )
attr->SetKind(wxGridCellAttr::Cell);
m_attrProvider->SetAttr(attr, row, col);
}
else