fix memory leak in SetColFormat() if the column already had an attribute (closes #1807)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61029 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-06-12 18:24:37 +00:00
parent f2a18fbec6
commit 4a53f7010a

View File

@@ -643,30 +643,30 @@ void wxGridRowOrColAttrData::SetAttr(wxGridCellAttr *attr, int rowOrCol)
{ {
if ( attr ) if ( attr )
{ {
// add the attribute - no need to do anything to reference count // store the new attribute, taking its ownership
// since we take ownership of the attribute.
m_rowsOrCols.Add(rowOrCol); m_rowsOrCols.Add(rowOrCol);
m_attrs.Add(attr); m_attrs.Add(attr);
} }
// nothing to remove // nothing to remove
} }
else else // we have an attribute for this row or column
{ {
size_t n = (size_t)i; size_t n = (size_t)i;
if ( m_attrs[n] == attr )
// nothing to do // notice that this code works correctly even when the old attribute is
return; // the same as the new one: as we own of it, we must call DecRef() on
// it in any case and this won't result in destruction of the new
// attribute if it's the same as old one because it must have ref count
// of at least 2 to be passed to us while we keep a reference to it too
m_attrs[n]->DecRef();
if ( attr ) if ( attr )
{ {
// change the attribute, handling reference count manually, // replace the attribute with the new one
// taking ownership of the new attribute.
m_attrs[n]->DecRef();
m_attrs[n] = attr; m_attrs[n] = attr;
} }
else else // remove the attribute
{ {
// remove this attribute, handling reference count manually
m_attrs[n]->DecRef();
m_rowsOrCols.RemoveAt(n); m_rowsOrCols.RemoveAt(n);
m_attrs.RemoveAt(n); m_attrs.RemoveAt(n);
} }