Почему в карте структур STL оператор «[]» вызывает двойной вызов структуры dtor?

Я создал простой тестовый пример, демонстрирующий странное поведение, которое я ' я заметил в большей базе кода, над которым я работаю. Этот тестовый пример ниже. Я полагаюсь на оператор «[]» карты STL для создания указателя на структуру в карте таких структур. В приведенном ниже тестовом примере строка ...

TestStruct *thisTestStruct = &testStructMap["test"];

... получает указатель (и создает новую запись на карте). Я заметил странную вещь: эта строка не только вызывает создание новой записи на карте (из-за оператора «[]»), но по какой-то причине вызывает деструктор структуры еще два раза. Мне явно чего-то не хватает - любая помощь приветствуется! получает мне указатель (и создает новую запись на карте). Я заметил странную вещь: эта строка не только вызывает создание новой записи на карте (из-за оператора «[]»), но по какой-то причине вызывает деструктор структуры еще два раза. Мне явно чего-то не хватает - любая помощь приветствуется! получает мне указатель (и создает новую запись на карте). Я заметил странную вещь: эта строка не только вызывает создание новой записи на карте (из-за оператора «[]»), но по какой-то причине вызывает деструктор структуры еще два раза. Мне явно чего-то не хватает - любая помощь приветствуется! Спасибо!

#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";
    }
};

приведенный выше код выводит следующее ...

/*
Marker One
TestStruct Constructor!             //makes sense
TestStruct Destructor!               //<---why?
TestStruct Destructor!               //<---god why?
Marker Two
TestStruct Destructor!               //makes sense
*/

... но я не понимаю, что вызывает первые два вызова деструктора TestStruct? (Я думаю, что последний вызов деструктора имеет смысл, потому что testStructMap выходит за пределы области видимости.)

8
задан justin 9 November 2011 в 07:46
поделиться