map as associative array destroy object twice

S

semkin55

Here is a small program, that traces construction and distruction of
class A objects.
If I use make_pair to insert in a map everything is OK.
If I insert using [], than objects with index 11, 7 and 3 will be
deleted twice and objects with indexes 10, 6 and 2 not deleted at all.
What is wrong ? I am new to standard library.

I use Sun Studio 10: C++ 5.7 Compiler

#include <map>
#include <iostream.h>
using namespace std;

class A
{
public:
A() : i(0)
{
j = k++;
cout << "Con " << i << " " << j << "\n";
};

A(int l) : i(l)
{
j = k++;
cout << "Con_k " << i << " " << j << "\n";
};

~A()
{
cout << "Dest " << i << " " << j << "\n";
};

A(const A& a)
{
i = a.i;
j = k++;
cout << "Copy " << i << " " << j << "\n";
};

int i;
int j;
static int k;
};

int A::k = 0;

int main()
{
cout << "1\n";
std::string s;
std::map<std::string, A> mp;

cout << "2\n";
s = "A";
mp = A(1);
//mp.insert(make_pair(s, A(1)));

cout << "3\n";
s = "B";
//mp.insert(make_pair(s, A(2)));
mp = A(2);

cout << "4\n";
s = "C";
mp = A(3);
//mp.insert(make_pair(s, A(3)));

cout << "5\n";
}
 
P

Pete Becker

Here is a small program, that traces construction and distruction of
class A objects.
If I use make_pair to insert in a map everything is OK.
If I insert using [], than objects with index 11, 7 and 3 will be
deleted twice and objects with indexes 10, 6 and 2 not deleted at all.
What is wrong ? I am new to standard library.

Your class A doesn't instrument its assignment operator.

--

-- Pete
Roundhouse Consulting, Ltd. (www.versatilecoding.com)
Author of "The Standard C++ Library Extensions: a Tutorial and
Reference." (www.petebecker.com/tr1book)
 
V

Victor Bazarov

Here is a small program, that traces construction and distruction of
class A objects.
If I use make_pair to insert in a map everything is OK.
If I insert using [], than objects with index 11, 7 and 3 will be
deleted twice and objects with indexes 10, 6 and 2 not deleted at all.
What is wrong ? I am new to standard library.

I use Sun Studio 10: C++ 5.7 Compiler

#include <map>
#include <iostream.h>

There is no <iostream.h>

#include <iostream>

and you don't have the necessary <string>:

#include said:
using namespace std;

class A
{
public:
A() : i(0)
{
j = k++;
cout << "Con " << i << " " << j << "\n";
};

A(int l) : i(l)
{
j = k++;
cout << "Con_k " << i << " " << j << "\n";
};

~A()
{
cout << "Dest " << i << " " << j << "\n";
};

A(const A& a)
{
i = a.i;
j = k++;
cout << "Copy " << i << " " << j << "\n";
};

Add here:

A& operator=(const A& a)
{
cout << "Was " << i << ' ' << j << " -- now ";
i = a.i;
j = a.j;
cout << i << " " << j << "\n";
return *this;
}
int i;
int j;
static int k;
};

int A::k = 0;

int main()
{
cout << "1\n";
std::string s;
std::map<std::string, A> mp;

cout << "2\n";
s = "A";
mp = A(1);
//mp.insert(make_pair(s, A(1)));

cout << "3\n";
s = "B";
//mp.insert(make_pair(s, A(2)));
mp = A(2);

cout << "4\n";
s = "C";
mp = A(3);
//mp.insert(make_pair(s, A(3)));

cout << "5\n";
}


V
 
S

semkin55

Here is a small program, that traces construction and distruction of
class A objects.
If I use make_pair to insert in a map everything is OK.
If I insert using [], than objects with index 11, 7 and 3 will be
deleted twice and objects with indexes 10, 6 and 2 not deleted at all.
What is wrong ? I am new to standard library.
I use Sun Studio 10: C++ 5.7 Compiler
#include <map>
#include <iostream.h>

There is no <iostream.h>

#include <iostream>

and you don't have the necessary <string>:

#include <string>




using namespace std;
class A
{
public:
A() : i(0)
{
j = k++;
cout << "Con " << i << " " << j << "\n";
};
A(int l) : i(l)
{
j = k++;
cout << "Con_k " << i << " " << j << "\n";
};
~A()
{
cout << "Dest " << i << " " << j << "\n";
};
A(const A& a)
{
i = a.i;
j = k++;
cout << "Copy " << i << " " << j << "\n";
};

Add here:

A& operator=(const A& a)
{
cout << "Was " << i << ' ' << j << " -- now ";
i = a.i;
j = a.j;
cout << i << " " << j << "\n";
return *this;
}






int i;
int j;
static int k;
};
int A::k = 0;
int main()
{
cout << "1\n";
std::string s;
std::map<std::string, A> mp;
cout << "2\n";
s = "A";
mp = A(1);
//mp.insert(make_pair(s, A(1)));

cout << "3\n";
s = "B";
//mp.insert(make_pair(s, A(2)));
mp = A(2);

cout << "4\n";
s = "C";
mp = A(3);
//mp.insert(make_pair(s, A(3)));

cout << "5\n";
}

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask- Hide quoted text -

- Show quoted text -- Hide quoted text -

- Show quoted text -


I found this after posting and added code:

A& operator=(const A& a)
{
i = a.i;
j = k++;
cout << "Asgn " << i << " " << j << "\n";
return *this;
};

But it fixed only one problem: objects are not deleted twice, but 3
objects (index 12, 7 and 2) not deleted at all.
 
V

Victor Bazarov

Here is a small program, that traces construction and distruction of
class A objects.
If I use make_pair to insert in a map everything is OK.
If I insert using [], than objects with index 11, 7 and 3 will be
deleted twice and objects with indexes 10, 6 and 2 not deleted at
all. What is wrong ? I am new to standard library.
I use Sun Studio 10: C++ 5.7 Compiler
#include <map>
#include <iostream.h>

There is no <iostream.h>

#include <iostream>

and you don't have the necessary <string>:

#include <string>




using namespace std;
class A
{
public:
A() : i(0)
{
j = k++;
cout << "Con " << i << " " << j << "\n";
};
A(int l) : i(l)
{
j = k++;
cout << "Con_k " << i << " " << j << "\n";
};
~A()
{
cout << "Dest " << i << " " << j << "\n";
};
A(const A& a)
{
i = a.i;
j = k++;
cout << "Copy " << i << " " << j << "\n";
};

Add here:

A& operator=(const A& a)
{
cout << "Was " << i << ' ' << j << " -- now ";
i = a.i;
j = a.j;
cout << i << " " << j << "\n";
return *this;
}






int i;
int j;
static int k;
};
int A::k = 0;
int main()
{
cout << "1\n";
std::string s;
std::map<std::string, A> mp;
cout << "2\n";
s = "A";
mp = A(1);
//mp.insert(make_pair(s, A(1)));

cout << "3\n";
s = "B";
//mp.insert(make_pair(s, A(2)));
mp = A(2);

cout << "4\n";
s = "C";
mp = A(3);
//mp.insert(make_pair(s, A(3)));

cout << "5\n";
}

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask- Hide
quoted text -

- Show quoted text -- Hide quoted text -

- Show quoted text -


I found this after posting and added code:

A& operator=(const A& a)
{
i = a.i;
j = k++;


Why are you increasing 'k' here? It's not a new object.
cout << "Asgn " << i << " " << j << "\n";
return *this;
};

But it fixed only one problem: objects are not deleted twice, but 3
objects (index 12, 7 and 2) not deleted at all.

I think your tracking is wrong. Print out 'this' in the c-tor, d-tor,
and the assignment op to actually track the objects PROPERLY.

V
 

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,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top