以下のコードでは、デストラクタが複数回呼び出されます:-
#include<iostream>
#include<map>
using namespace std;
class abc{
public:
abc()
{
cout<<"\nconstructor called\n";
}
~abc()
{
cout<<"\ndestructor called\n";
}
void fun()
{
cout<<"\nfunction called\n";
}
};
struct cmp_str
{
bool operator()(abc a,abc b)
{
return 1;
}
};
int main()
{
map<abc,int,cmp_str> mymap;
abc a;
mymap[a]=5; // destructor is called twice
//mymap.insert(pair<abc,int>(a,5)); // // destructor is called 3 times
map<abc,int,cmp_str>::iterator it=mymap.begin();
mymap.clear();
while(1)
{
//infinite loop added to check number of times destrctor is called before objects goes out of scope
}
return 1;
}
さまざまな方法でオブジェクトに値を挿入しています。1 つは insert() 関数を使用する方法で、もう 1 つは単純な [] を使用する方法です。mymap[a]=5; を使用して挿入すると、次に、デストラクタが2回呼び出されますが、この行にコメントを付けて挿入にinsert()関数を使用すると、デストラクタが3回呼び出されます。mymap.clear() のために1つのデストラクタを無視できますが、残りのデストラクタが呼び出されるのはなぜですか。
オブジェクトがスコープ外になったときに呼び出されるデストラクタを無視できるように、 return のすぐ上に無限ループを挿入しました。デストラクタへの複数の呼び出しは危険であり、適切に処理されないとコア ダンプが発生する可能性があるため、この動作を理解するのを手伝ってください。