7

デストラクタは、使用std::map時に要素に対して呼び出されstd::map::clearますか?

デバッグしようとしましたが、デストラクタが呼び出されるのstd::map<string,string>を確認できませんでした。std::string誰でも私の理解を助けることができますか?

ドキュメントには呼び出されると記載されていますが、私はそれに気づきませんでした。

4

4 に答える 4

5

ドキュメンテーションは正しく、呼び出されます。

破棄はメソッドによって行われstd::allocator<T>::deallocate()ます。デバッガーでそれをトレースします。

http://www.cplusplus.com/reference/std/memory/allocator/

于 2012-11-17T07:55:35.500 に答える
5

デストラクタが呼び出されます。以下に例を示します。

#include <iostream>
#include <map>

class A
{
 public:
  A() { std::cout << "Constructor " << this << std::endl; }
  A(const A& other) { std::cout << "Copy Constructor " << this << std::endl; }
  ~A() { std::cout << "Destructor " << this <<std::endl; }
};

int main()
{
  std::map<std::string, A> mp;

  A a;

  mp.insert(std::pair<std::string, A>("hello", a));
  mp.clear();

  std::cout << "Ending" << std::endl;
}

これにより、次のような出力が報告されます。

Constructor 0xbf8ba47a
Copy Constructor 0xbf8ba484
Copy Constructor 0xbf8ba48c
Copy Constructor 0x950f034
Destructor 0xbf8ba48c
Destructor 0xbf8ba484
Destructor 0x950f034
Ending
Destructor 0xbf8ba47a

したがって、クリア関数を呼び出すことによってデストラクタが呼び出されることがわかります。

于 2012-11-17T08:13:02.873 に答える
0

whereとはstd::map<A,B>、ブレークポイントを設定したデストラクタを持つカスタム タイプです。それが呼び出されることがわかり、この破壊が正確にどのスコープで発生するかがわかります。AB

于 2012-11-17T07:59:43.273 に答える