代码之家  ›  专栏  ›  技术社区  ›  Xolve

C++太多的析构函数,称为很少的对象[复制品]

  •  6
  • Xolve  · 技术社区  · 15 年前

    这是代码(也在 http://pastebin.com/yw5z2hnG

    #include <iostream>
    #include <vector>
    using namespace std;
    
    class X
    {
        public:
        int i;
        X();
        ~X();
    };
    
    X::X()
    {
        i = 1;
        cout << "---constructor" << '\n';
    }
    
    X::~X()
    {
        cout << "***desctructor" << '\n';
    }
    
    int main()
    {
        vector<X> *vx = new vector<X>;
        cout << "------------------------------------" << endl;
        vx->push_back(X());
        vx->push_back(X());
        vx->push_back(X());
        vx->push_back(X());
        vx->push_back(X());
        cout << "------------------------------------" << endl;
        delete vx;
    }
    

    我得到的输出是:

    ------------------------------------
    ---constructor
    ***desctructor
    ---constructor
    ***desctructor
    ***desctructor
    ---constructor
    ***desctructor
    ***desctructor
    ***desctructor
    ---constructor
    ***desctructor
    ---constructor
    ***desctructor
    ***desctructor
    ***desctructor
    ***desctructor
    ***desctructor
    ------------------------------------
    ***desctructor
    ***desctructor
    ***desctructor
    ***desctructor
    ***desctructor
    

    我不明白为什么这么多的析构函数被称为。

    2 回复  |  直到 15 年前
        1
  •  14
  •   CB Bailey    15 年前

    如果您定义自己的复制构造函数,您将看到正在构造的其他对象:

    class X
    {
        public:
        int i;
        X(const X&);
        X();
        ~X();
    };
    
    X::X(const X& x) : i( x.i )
    {
        cout << "---copy constructor\n";
    }
    
    // ... rest as before
    

        2
  •  1
  •   Vladimir    15 年前

    还有一个细节-如果事先为向量预留空间:

    int main()
    {
        vector<X> *vx = new vector<X>;
        vx->reserve(5);
        ....
    

    ---constructor
    +++ copy constructor
    ***desctructor
    ---constructor
    +++ copy constructor
    ***desctructor
    ...
    

    push_back()