Re: deleting dynamically allocated objects in a container
* "Daniel T." <danie...@earthlink.net> wrote:
In article
<4497e00d-a5dd-4c17-af38-8947767cb...@k1g2000prl.googlegroups.com>,
"subramanian10...@yahoo.com, India" <subramanian10...@yahoo.com>
wrote:
Suppose 'Test' is a class. I dynamically allocate few 'Test' objects
and push them into a vector<Test*>. I want to delete the dynamically
allocated 'Test' objects using a Standard Library Algorithm instead of
writing a hand-written 'for loop'.
Following is my attempt: (I am using cout statements in the ctor and
dtor only for understanding purpose).
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Test
{
public:
explicit Test(int arg = 0);
~Test();
private:
int val;
};
inline Test::Test(int arg) : val(arg)
{
cout << "From Test ctor: " << val << endl;
}
inline Test::~Test()
{
cout << "From Test dtor: " << val << endl;
}
inline void delete_pointer(Test* & arg)
{
delete arg;
arg = 0;
}
int main()
{
typedef vector<Test*> Container;
Container c;
c.push_back(new Test(100));
c.push_back(new Test(200));
c.push_back(new Test(300));
for_each(c.begin(), c.end(), delete_pointer);
// just to ensure the element values are zero, print them
cout << c[0] << " " << c[1] << " " << c[2] << endl;
return EXIT_SUCCESS;
}
This porgram compiles fine with g++ and when run, produces the output:
From Test ctor: 100
From Test ctor: 200
From Test ctor: 300
From Test dtor: 100
From Test dtor: 200
From Test dtor: 300
0 0 0
My solution seems to work. But is there a better solution ?
Here is Stroustrup's solution (from TC++PL)
template<class T> T* delete_ptr(T* p) { delete p; return 0; }
void purge(deque<Shape*>& s)
{
transform(s.begin(), s.end() ,s.begin(), &delete_ptr);
}
I get compilation error for this 'transform' call. Here is the
complete modified program z.cpp:
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Test
{
public:
explicit Test(int arg = 0);
~Test();
private:
int val;
};
inline Test::Test(int arg) : val(arg)
{
cout << "From Test ctor: " << val << endl;
}
inline Test::~Test()
{
cout << "From Test dtor: " << val << endl;
}
template <typename T>
T* delete_ptr(T* p)
{
delete p;
return 0;
}
int main()
{
typedef vector<Test*> Container;
Container c;
c.push_back(new Test(100));
c.push_back(new Test(200));
c.push_back(new Test(300));
transform(c.begin(), c.end(), c.begin(), &delete_ptr);
// just to ensure the element values are zero, print them
cout << c[0] << " " << c[1] << " " << c[2] << endl;
return EXIT_SUCCESS;
}
I compiled this program with g++3.4.3 as
g++ -std=c++98 -pedantic -Wall -Wextra z.cpp
It generated the following compilation error:
z.cpp: In function `int main()':
z.cpp:42: error: no matching function for call to
`transform(__gnu_cxx::__normal_iterator<Test**, std::vector<Test*,
std::allocator<Test*> > >, __gnu_cxx::__normal_iterator<Test**,
std::vector<Test*, std::allocator<Test*> > >,
__gnu_cxx::__normal_iterator<Test**, std::vector<Test*,
std::allocator<Test*> > >, <unknown type>)'
Kindly help me to make this modified program compile fine and produce
the expected result which I stated at the beginning of OP.
Thanks
V.Subramanian