the identifier \_\_WXDEBUG\_\_ is defined. It takes over memory deallocation, allowing
wxDebugContext operations.
+
+
+%% wxObjectRefData
+
\section{\class{wxObjectRefData}}\label{wxobjectrefdata}
This class is used to store reference-counted data. Derive classes from this to
\func{}{wxObjectRefData}{\void}
-Default constructor. Initialises the {\bf m\_count} member to 1.
+Default constructor. Initialises the internal reference count to 1.
\membersection{wxObjectRefData::\destruct{wxObjectRefData}}\label{wxobjectrefdatadtor}
\func{}{wxObjectRefData}{\void}
-Destructor.
+Destructor. It's declared {\tt protected} so that wxObjectRefData instances will never
+be destroyed directly but only as result of a \helpref{DecRef}{wxobjectrefdatadecref} call.
\membersection{wxObjectRefData::GetRefCount}\label{wxobjectrefdatagetrefcount}
\constfunc{int}{GetRefCount}{\void}
Returns the reference count associated with this shared data.
-When this goes to zero during a \helpref{wxObject::UnRef}{wxobjectunref}, an object
-can delete this {\bf wxObjectRefData} object.
+When this goes to zero during a \helpref{DecRef}{wxobjectrefdatadecref} call, the object
+will auto-free itself.
+
+\membersection{wxObjectRefData::DecRef}\label{wxobjectrefdatadecref}
+
+\func{void}{DecRef}{\void}
+
+Decrements the reference count associated with this shared data and, if it reaches zero,
+destroys this instance of wxObjectRefData releasing its memory.
+
+Please note that after calling this function, the caller should absolutely avoid to use
+the pointer to this instance since it may not be valid anymore.
+
+\membersection{wxObjectRefData::IncRef}\label{wxobjectrefdataincref}
+
+\func{void}{IncRef}{\void}
+
+Increments the reference count associated with this shared data.
public:
wxObjectRefData() : m_count(1) { }
- virtual ~wxObjectRefData() { }
int GetRefCount() const { return m_count; }
+ void IncRef() { m_count++; }
+ void DecRef();
+
+protected:
+ // this object should never be destroyed directly but only as a
+ // result of a DecRef() call:
+ virtual ~wxObjectRefData() { }
+
private:
+ // our refcount:
int m_count;
};
+// ----------------------------------------------------------------------------
+// wxObjectDataPtr: helper class to avoid memleaks because of missing calls
+// to wxObjectRefData::DecRef
+// ----------------------------------------------------------------------------
+
+template <class T>
+class wxObjectDataPtr
+{
+public:
+ typedef T element_type;
+
+ wxEXPLICIT wxObjectDataPtr(T *ptr = NULL) : m_ptr(ptr) {}
+
+ // copy ctor
+ wxObjectDataPtr(const wxObjectDataPtr<T> &tocopy)
+ : m_ptr(tocopy.m_ptr)
+ {
+ if (m_ptr)
+ m_ptr->IncRef();
+ }
+
+ ~wxObjectDataPtr()
+ {
+ if (m_ptr)
+ m_ptr->DecRef();
+ }
+
+ T *get() const { return m_ptr; }
+ T *operator->() const { return get(); }
+
+ void reset(T *ptr)
+ {
+ if (m_ptr)
+ m_ptr->DecRef();
+ m_ptr = ptr;
+ }
+
+ wxObjectDataPtr& operator=(const wxObjectDataPtr &tocopy)
+ {
+ if (m_ptr)
+ m_ptr->DecRef();
+ m_ptr = tocopy.m_ptr;
+ if (m_ptr)
+ m_ptr->IncRef();
+ return *this;
+ }
+
+ wxObjectDataPtr& operator=(T *ptr)
+ {
+ if (m_ptr)
+ m_ptr->DecRef();
+ m_ptr = ptr;
+ if (m_ptr)
+ m_ptr->IncRef();
+ return *this;
+ }
+
+private:
+ T *m_ptr;
+};
+
// ----------------------------------------------------------------------------
// wxObject: the root class of wxWidgets object hierarchy
// ----------------------------------------------------------------------------
#ifdef _MSC_VER
return (wxClassInfo*) m_classInfo;
#else
- return wx_const_cast(wxClassInfo *, m_classInfo);
+ wxDynamicClassInfo *nonconst = wx_const_cast(wxDynamicClassInfo *, m_classInfo);
+ return wx_static_cast(wxClassInfo *, nonconst);
#endif
}
}
+// ----------------------------------------------------------------------------
+// wxObjectRefData
+// ----------------------------------------------------------------------------
+
+void wxObjectRefData::DecRef()
+{
+ if ( --m_count == 0 )
+ delete this;
+}
+
+
// ----------------------------------------------------------------------------
// wxObject
// ----------------------------------------------------------------------------
if ( clone.m_refData )
{
m_refData = clone.m_refData;
- ++(m_refData->m_count);
+ m_refData->IncRef();
}
}
{
wxASSERT_MSG( m_refData->m_count > 0, _T("invalid ref data count") );
- if ( --m_refData->m_count == 0 )
- delete m_refData;
+ m_refData->DecRef();
m_refData = NULL;
}
}