He creado un caso de prueba simple que muestra un comportamiento extraño que he notado en una base de códigos más grande en la que estoy trabajando. Este caso de prueba está abajo. Confío en el operador "[]" del Mapa STL para crear un puntero a una estructura en un mapa de tales estructuras. En el caso de prueba a continuación, la línea ...En un mapa STL de estructuras, ¿por qué el operador "[]" hace que se invoque el dtor de la estructura 2 veces extra?
TestStruct *thisTestStruct = &testStructMap["test"];
... me da el puntero (y crea una nueva entrada en el mapa). Lo extraño que he notado es que esta línea no solo crea una nueva entrada en el mapa (debido al operador "[]"), sino que por alguna razón hace que el destructor de la estructura sea llamado dos veces más. Obviamente me falta algo, ¡cualquier ayuda es muy apreciada! Gracias!
#include <iostream>
#include <string>
#include <map>
using namespace std;
struct TestStruct;
int main (int argc, char * const argv[]) {
map<string, TestStruct> testStructMap;
std::cout << "Marker One\n";
//why does this line cause "~TestStruct()" to be invoked twice?
TestStruct *thisTestStruct = &testStructMap["test"];
std::cout << "Marker Two\n";
return 0;
}
struct TestStruct{
TestStruct(){
std::cout << "TestStruct Constructor!\n";
}
~TestStruct(){
std::cout << "TestStruct Destructor!\n";
}
};
el código anterior genera el siguiente ...
/*
Marker One
TestStruct Constructor! //makes sense
TestStruct Destructor! //<---why?
TestStruct Destructor! //<---god why?
Marker Two
TestStruct Destructor! //makes sense
*/
... pero no entiendo lo que hace que las dos primeras invocaciones del destructor de TestStruct? (Creo que la última invocación destructor tiene sentido porque testStructMap va fuera de alcance.)
La respuesta está por debajo. Pero ponga el nivel de optimización tan alto como sea posible y vea cuántas copias se eliminan. –
Más detalles sobre esta pregunta y el por qué detrás de ella se pueden encontrar en esta pregunta: https://stackoverflow.com/questions/26021118/why-doesnt-c-stdmapoperator-use-inplace-new – srm