作業中のより大きなコードベースで気付いた奇妙な動作を示す単純なテストケースを作成しました。このテストケースは以下のとおりです。私は、STLマップの「[]」演算子を使用して、そのような構造体のマップに構造体へのポインターを作成しています。以下のテストケースでは、次の行が...
TestStruct *thisTestStruct = &testStructMap["test"];
...ポインタを取得します(そしてマップに新しいエントリを作成します)。私が気付いた奇妙なことは、この行によってマップに新しいエントリが作成されるだけでなく( "[]"演算子のため)、何らかの理由で構造体のデストラクタが2回余分に呼び出されることです。私は明らかに何かが欠けています-どんな助けでも大歓迎です!ありがとう!
#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のデストラクタの最初の2つの呼び出しの原因がわかりませんか?(testStructMapがスコープ外になるため、最後のデストラクタ呼び出しは理にかなっていると思います。)