Std :: map :: clear and destructor elements

Is a destructor used to call std::map when using std::map::clear ?

I tried to debug std::map<string,string> , but could not see the called destructor std::string . Can someone help me in understanding?

The documentation states that it is called, but I could not notice it.

+5
source share
4 answers

The documentation is correct, it is called.

Destruction will be performed using the std::allocator<T>::deallocate() method. Track this in your debugger.

http://www.cplusplus.com/reference/std/memory/allocator/

+4
source

The destructor is called. Here is an example to illustrate:

 #include <iostream> #include <map> class A { public: A() { std::cout << "Constructor " << this << std::endl; } A(const A& other) { std::cout << "Copy Constructor " << this << std::endl; } ~A() { std::cout << "Destructor " << this <<std::endl; } }; int main() { std::map<std::string, A> mp; A a; mp.insert(std::pair<std::string, A>("hello", a)); mp.clear(); std::cout << "Ending" << std::endl; } 

An output similar to this will be displayed here:

 Constructor 0xbf8ba47a Copy Constructor 0xbf8ba484 Copy Constructor 0xbf8ba48c Copy Constructor 0x950f034 Destructor 0xbf8ba48c Destructor 0xbf8ba484 Destructor 0x950f034 Ending Destructor 0xbf8ba47a 

So you can see that destructors are called by calling clear.

+5
source

try with std::map<A,B> , where A and B are custom types that have a destructor in which you set a breakpoint. You will see that it is called, and exactly in what area this destruction takes place.

0
source

Here's a slightly more complete test based on Chris Mansley's code, because I wanted to see the effect on values, ptrs and refs - and I wanted to see the difference between wiping and wiping. No difference. As a result, the destructor is called only for the types of values ​​that you expect. I just like to test my understanding 8)

 #include <iostream> #include <map> class A { public: std::string some_data; A(std::string some_data) : some_data(some_data) { std::cout << " A(" << some_data << ") @" << this << std::endl; } A(const A& other) { some_data = other.some_data; std::cout << " Copy A(" << other.some_data << ") @" << this << std::endl; } ~A() { std::cout << " Destruct ~A(" << some_data << ") @" << this << std::endl; } }; void clear_test_value (void) { std::cout << "clear_test_value() {" << std::endl; std::map<std::string, A> mp; A a("A1 data"); mp.insert(std::pair<std::string, A>("key1", a)); mp.clear(); std::cout << "}" << std::endl; std::cout << std::endl; } void erase_test_value (void) { std::cout << "erase_test_value() {" << std::endl; std::map<std::string, A> mp; A a("A1 data"); mp.insert(std::pair<std::string, A>("key2", a)); auto f = mp.find("key2"); if (f == mp.end()) { std::cout << "failed to find element {" << std::endl; return; } mp.erase(f); std::cout << "}" << std::endl; std::cout << std::endl; } void clear_test_ptr (void) { std::cout << "clear_test_ptr() {" << std::endl; std::map<std::string, A*> mp; A a("A1 data"); mp.insert(std::pair<std::string, A*>("key1", &a)); mp.clear(); std::cout << "}" << std::endl; std::cout << std::endl; } void erase_test_ptr (void) { std::cout << "erase_test() {" << std::endl; std::map<std::string, A*> mp; A a("A1 data"); mp.insert(std::pair<std::string, A*>("key2", &a)); auto f = mp.find("key2"); if (f == mp.end()) { std::cout << "failed to find element {" << std::endl; return; } mp.erase(f); std::cout << "}" << std::endl; std::cout << std::endl; } void clear_test_ref (void) { std::cout << "clear_test_ref() {" << std::endl; std::map<std::string, A&> mp; A a("A1 data"); mp.insert(std::pair<std::string, A&>("key1", a)); mp.clear(); std::cout << "}" << std::endl; std::cout << std::endl; } void erase_test_ref (void) { std::cout << "erase_test_ref() {" << std::endl; std::map<std::string, A&> mp; A a("A1 data"); mp.insert(std::pair<std::string, A&>("key2", a)); auto f = mp.find("key2"); if (f == mp.end()) { std::cout << "failed to find element {" << std::endl; return; } mp.erase(f); std::cout << "}" << std::endl; std::cout << std::endl; } int main () { clear_test_value(); erase_test_value(); clear_test_ptr(); erase_test_ptr(); clear_test_ref(); erase_test_ref(); return (0); } 

Output:

 clear_test_value() { A(A1 data) @0x7ffee07389a0 Copy A(A1 data) @0x7ffee0738960 Copy A(A1 data) @0x7fe98fc029c8 Destruct ~A(A1 data) @0x7ffee0738960 Destruct ~A(A1 data) @0x7fe98fc029c8 } Destruct ~A(A1 data) @0x7ffee07389a0 erase_test_value() { A(A1 data) @0x7ffee07387f0 Copy A(A1 data) @0x7ffee07387b0 Copy A(A1 data) @0x7fe98fc029c8 Destruct ~A(A1 data) @0x7ffee07387b0 Destruct ~A(A1 data) @0x7fe98fc029c8 } Destruct ~A(A1 data) @0x7ffee07387f0 clear_test_ptr() { A(A1 data) @0x7ffee07389b0 } Destruct ~A(A1 data) @0x7ffee07389b0 erase_test() { A(A1 data) @0x7ffee0738800 } Destruct ~A(A1 data) @0x7ffee0738800 clear_test_ref() { A(A1 data) @0x7ffee07389b0 } Destruct ~A(A1 data) @0x7ffee07389b0 erase_test_ref() { A(A1 data) @0x7ffee0738800 } Destruct ~A(A1 data) @0x7ffee0738800 
0
source

Source: https://habr.com/ru/post/1446609/


All Articles