Web example of Visitor Design Pattern -- suspected memory leak

P

pauldepstein

Illustration of Visitor pattern below is copy-pasted from the web: My
opinion is that the statement delete set; needs to be inserted
at the end of the for loop in main to prevent a memory leak.
Am I correct or am I missing something?

Thanks,

Paul Epstein

class Color
{
public:
virtual void accept(class Visitor*) = 0;
};

class Red: public Color
{
public:
/*virtual*/void accept(Visitor*);
void eye()
{
cout << "Red::eye\n";
}
};
class Blu: public Color
{
public:
/*virtual*/void accept(Visitor*);
void sky()
{
cout << "Blu::sky\n";
}
};

class Visitor
{
public:
virtual void visit(Red*) = 0;
virtual void visit(Blu*) = 0;
};

class CountVisitor: public Visitor
{
public:
CountVisitor()
{
m_num_red = m_num_blu = 0;
}
/*virtual*/void visit(Red*)
{
++m_num_red;
}
/*virtual*/void visit(Blu*)
{
++m_num_blu;
}
void report_num()
{
cout << "Reds " << m_num_red << ", Blus " << m_num_blu <<
'\n';
}
private:
int m_num_red, m_num_blu;
};

class CallVisitor: public Visitor
{
public:
/*virtual*/void visit(Red *r)
{
r->eye();
}
/*virtual*/void visit(Blu *b)
{
b->sky();
}
};

void Red::accept(Visitor *v)
{
v->visit(this);
}

void Blu::accept(Visitor *v)
{
v->visit(this);
}

int main()
{
Color *set[] =
{
new Red, new Blu, new Blu, new Red, new Red, 0
};
CountVisitor count_operation;
CallVisitor call_operation;
for (int i = 0; set; i++)
{
set->accept(&count_operation);
set->accept(&call_operation);
// I would now say delete set; but the author didn't.
}
count_operation.report_num();
}
 
A

Andrew Tomazos

Illustration of Visitor pattern below is copy-pasted from the web:  My
opinion is that the statement  delete set;   needs to be inserted
at the end of the for loop in main to prevent a memory leak.
Am I correct or am I missing something?


All memory is freed anyway when the process is terminated after main
returns, and none of those Color subclasses have a destructor, so the
deletes will have no impact. But yes, it is generally a good idea to
call delete on any new'd objects before main returns, just in case
someone adds a destructor later, or moves the code into a non-main
function.
-Andrew.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top