1

以下のコードでは、デストラクタが複数回呼び出されます:-

#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 のすぐ上に無限ループを挿入しました。デストラクタへの複数の呼び出しは危険であり、適切に処理されないとコア ダンプが発生する可能性があるため、この動作を理解するのを手伝ってください。

4

2 に答える 2

3

比較ファンクターはそのパラメーターを値で受け入れるため、一時的なコピーが作成されて破棄されます。

ただし、as-if ルールのコピー省略例外のため、存在する一時オブジェクトの正確な数を予測することは困難です。それは、オプティマイザーがどれだけ優れているか、およびすべてがインライン化されるかどうかによって異なります。

于 2013-06-24T18:28:32.313 に答える
0

新しいオブジェクトを作成する代わりに、比較演算子で参照によるキャプチャ....

bool operator()(const abc& a, const abc& b)
于 2013-06-24T18:28:08.170 に答える