Re: templated deletePointer in for_each algorithm
shaun wrote:
I am working on code where I am handed a vector of pointers vector<T*>
or a map<std::string, T*>, and I have to delete the objects and set the
pointers to zero. I have been using a 'for' loop and thought it might be
instructive to write a 'deletePointer' which can be used in an algorithm
or standalone.
(code at end of mail)
I'm afraid these are raw pointers, I have no option to use a smart
pointer. After some messing around, I arrived to the following code
which gets rid of my adapter. In the code, I do at least know when I
have a vector or a map, so I can use the separate functions
"deleteMapPointer" and "deleteVecPointer". It would, of course, be nicer
to overload a single "deletePointer" function. But someone a lot smarter
than me will have to work that out...
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <utility>
#include <algorithm>
template <class T>
void deletePointer(T* &myPointer){
delete myPointer;
myPointer = NULL;
}
template <class T>
void deleteMapPointer(typename T::value_type &myPair){
delete myPair.second;
myPair.second = NULL;
}
template <class T>
void deleteVecPointer(typename T::value_type &myVal){
delete myVal;
myVal = NULL;
}
using namespace std;
void print (string * elem){
cout<<*elem<<" ";
}
void printPointer(string * p){
cout<<hex<<p<<" ";
}
int main (int argc, char * const argv[]) {
string * pMyString = new string;
*pMyString = "hello";
cout << "Heres the newed string :"<<*pMyString<<endl;
cout << "with pointer value :"<<hex<<pMyString<<endl;
//Deletion with resetting the pointer:
deletePointer(pMyString);
//
cout << "The string has been deleted, and now.."<<endl;
cout << "the pointer value is :"<<hex<<pMyString<<endl;
//set up map and vector
typedef map<int, string*> MapType;
MapType myMap;
typedef vector<string *> VecType;
VecType myVec;
typedef string * PString;
for (int i(0);i not_eq 10; ++i){
PString pString=new string;
PString pString2=new string;
*pString = "burt";
*pString2 = "smith";
myVec.push_back(pString);
myMap.insert(make_pair(i,pString2));
}
for_each(myVec.begin(),myVec.end(),print);
cout<<endl;
for_each(myVec.begin(),myVec.end(),printPointer);
cout<<endl;
for_each(myVec.begin(),myVec.end(),deleteVecPointer<VecType>);
for_each(myVec.begin(),myVec.end(),printPointer);
cout<<endl;
for_each(myMap.begin(),myMap.end(),deleteMapPointer<MapType>);
cout<<hex<<myMap[2]<<endl;
string myFalse("burt");
return 0;
}