Skip to content

Commit d0a39d3

Browse files
N-Dekkerdzenanz
authored andcommitted
STYLE: Declare Observer::m_Event (from itk::Object) as unique_ptr
The original code technically allowed an `Observer` (from the implementation of `itk::Object`) to be copied, causing its destructor to possibly be called twice, trying to do `delete m_Event` twice on the very same event object. Which would have undefined behavior, possibly causing a crash. This commit solves this potential problem by declaring m_Event as a `unique_ptr`, and removing the user-defined `Observer` destructor (leaving it "implicitly defaulted", following the Rule of Zero). Thereby it also removes the `virtual` keyword from the destructor, which is OK, because `Observer` is not a base class.
1 parent 5daed92 commit d0a39d3

File tree

1 file changed

+6
-11
lines changed

1 file changed

+6
-11
lines changed

Modules/Core/Common/src/itkObject.cxx

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
*=========================================================================*/
2828
#include "itkCommand.h"
2929
#include <algorithm>
30+
#include <memory> // For unique_ptr.
3031

3132
#include "itkSingleton.h"
3233

@@ -47,16 +48,10 @@ class ITKCommon_HIDDEN Observer
4748
, m_Event(event)
4849
, m_Tag(tag)
4950
{}
50-
virtual ~Observer();
51-
Command::Pointer m_Command;
52-
const EventObject * m_Event;
53-
unsigned long m_Tag;
51+
Command::Pointer m_Command;
52+
std::unique_ptr<const EventObject> m_Event;
53+
unsigned long m_Tag;
5454
};
55-
/* Create Out-of-line Definition */
56-
Observer::~Observer()
57-
{
58-
delete m_Event;
59-
}
6055

6156
class ITKCommon_HIDDEN SubjectImplementation
6257
{
@@ -248,7 +243,7 @@ SubjectImplementation::HasObserver(const EventObject & event) const
248243
{
249244
for (auto observer : m_Observers)
250245
{
251-
const EventObject * e = observer->m_Event;
246+
const EventObject * e = observer->m_Event.get();
252247
if (e->CheckEvent(&event))
253248
{
254249
return true;
@@ -267,7 +262,7 @@ SubjectImplementation::PrintObservers(std::ostream & os, Indent indent) const
267262

268263
for (auto observer : m_Observers)
269264
{
270-
const EventObject * e = observer->m_Event;
265+
const EventObject * e = observer->m_Event.get();
271266
const Command * c = observer->m_Command;
272267
os << indent << e->GetEventName() << "(" << c->GetNameOfClass();
273268
if (!c->GetObjectName().empty())

0 commit comments

Comments
 (0)