C ++太多的析构函数称为这么少的对象

时间:2010-08-29 10:20:50

标签: c++ constructor destructor

以下是代码(也在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 个答案:

答案 0 :(得分:14)

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

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

编译器将提供一个复制构造函数,如果你没有声明自己的日志,它就不会执行日志记录。

答案 1 :(得分:1)

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

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

然后你会得到以下输出:

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

因为你可以看到vector在需要重新分配它的存储时也会复制它的所有元素 - 这就是你为最后push_back()

获得5个拷贝构造函数和析构函数的原因