From 6c06e31bb22a36bce02b66889a80db0a173fb66f Mon Sep 17 00:00:00 2001 From: macbishop Date: Sun, 19 Sep 2004 18:32:13 +0000 Subject: [PATCH] Memory allocated in _constructor is now deleted when the object is destroyed --- src/CmdLine.cpp | 54 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/src/CmdLine.cpp b/src/CmdLine.cpp index 1b9eede..879c22b 100644 --- a/src/CmdLine.cpp +++ b/src/CmdLine.cpp @@ -46,26 +46,50 @@ CmdLine::CmdLine(const string& m, char delim, const string& v ) _constructor(); } +CmdLine::~CmdLine() +{ + list::iterator argIter; + list::iterator visIter; + + for(argIter = _argDeleteOnExitList.begin(); argIter != _argDeleteOnExitList.end(); ++argIter) { + delete *argIter; + } + + for(visIter = _visitorDeleteOnExitList.begin(); visIter != _visitorDeleteOnExitList.end(); ++visIter) { + delete *visIter; + } +} + void CmdLine::_constructor() { + Visitor *v; + Arg::setDelimiter( _delimiter ); - SwitchArg* help = new SwitchArg("h","help", - "Displays usage information and exits.", - false, new HelpVisitor( this ) ); + v = new HelpVisitor( this ); + SwitchArg* help = new SwitchArg("h","help", + "Displays usage information and exits.", + false, v); add( *help ); - + deleteOnExit(help); + deleteOnExit(v); + + v = new VersionVisitor( this ); SwitchArg* vers = new SwitchArg("v","version", - "Displays version information and exits.", - false, new VersionVisitor( this ) ); + "Displays version information and exits.", + false, v); add( *vers ); + deleteOnExit(vers); + deleteOnExit(v); + v = new IgnoreRestVisitor(); SwitchArg* ignore = new SwitchArg(Arg::flagStartString, - Arg::ignoreNameString, - "Ignores the rest of the labeled arguments following this flag.", - false, new IgnoreRestVisitor() ); + Arg::ignoreNameString, + "Ignores the rest of the labeled arguments following this flag.", + false, v); add( *ignore ); - + deleteOnExit(ignore); + deleteOnExit(v); } void CmdLine::xorAdd( vector& ors ) @@ -223,4 +247,14 @@ bool CmdLine::_emptyCombined(const string& s) return true; } +void CmdLine::deleteOnExit(Arg* ptr) +{ + _argDeleteOnExitList.push_back(ptr); +} + +void CmdLine::deleteOnExit(Visitor* ptr) +{ + _visitorDeleteOnExitList.push_back(ptr); +} + }