Friday 22 December 2017

c++ - std::pair and class destructors







Possible
Duplicate:

href="https://stackoverflow.com/questions/4172722/what-is-the-rule-of-three">What is
The Rule of Three?






How
exactly does std::pair call destructors for its components? I
am trying to add instances of a class to an std::map, but I am
getting errors regarding the destructor of my
class.



I have narrowed down my question/problem
to the following extremely simple
example.




Below,
my_class merely creates an int array
at construction, and deletes it at destruction. Somehow I am getting a "double delete"
error:



//my_class.h
class
my_class {
public:
int an_int;
int
*array;

//constructors:

my_class()

{
array = new int[2];

}
my_class(int new_int) : an_int(new_int)
{
array = new
int[2];
}

//destructor:

~my_class()

{
delete[] array;
}
};
//end of
my_class


Meanwhile,
over in
main.cpp...



//main.cpp
int
main(int argc, char* argv[])

{
std::map my_class> my_map;

my_map.insert( std::make_pair my_class> (1, my_class(71) ) );

return 0;
} // end
main


Compilation goes
fine, but this generates the following runtime
error:




*** glibc
detected *** ./experimental_code: double free or corruption
(fasttop):


Or, with
valgrind:



==15258== Invalid free()
/ delete / delete[] / realloc()
==15258== at 0x40249D7: operator
delete[](void*) (vg_replace_malloc.c:490)
==15258== by 0x8048B99: main
(my_class.h:38)
==15258== Address 0x42d6028 is 0 bytes inside a block of size
8 free'd

==15258== at 0x40249D7: operator delete[](void*)
(vg_replace_malloc.c:490)
==15258== by 0x8048B91: main
(my_class.h:38)


(line
numbers are off because I cut out comments and
stuff)



I must be missing something about
std::pair...?



Thanks
to all in advance!


itemprop="text">
class="normal">Answer





When you add
my_class to stl containers the copy constructor is called. As
you don't define one it does a memberwise copy and two my_class
objects are created that point to the same int array, When these are deleted the same
int array might be deleted twice



Please take a
look at href="https://stackoverflow.com/questions/4172722/what-is-the-rule-of-three">Rule of
three



In C++11 also
look at href="https://stackoverflow.com/questions/3106110/can-someone-please-explain-move-semantics-to-me">move
constructor
if you are worried about the
efficiency.


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...