Я создал простой тестовый пример, демонстрирующий странное поведение, которое я ' я заметил в большей базе кода, над которым я работаю. Этот тестовый пример ниже. Я полагаюсь на оператор «[]» карты 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 выходит за пределы области видимости.)