C++ C++;太多的析构函数调用的对象太少

C++ C++;太多的析构函数调用的对象太少,c++,constructor,destructor,C++,Constructor,Destructor,以下是代码(也可访问): 我不明白为什么要调用这么多析构函数。如果您定义自己的复制构造函数,您将看到正在构造的其他对象: 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 X类 { 公众:

以下是代码(也可访问):


我不明白为什么要调用这么多析构函数。

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

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
X类
{
公众:
int i;
X(常数X&);
X();
~X();
};
X::X(常数X&X):i(X.i)
{

cout还有一个细节-如果您提前为向量保留空间:

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

因此,正如您所看到的,vector在需要重新分配其存储时也会复制其所有元素-这就是为什么在最后一次
push_back()中会有5个复制构造函数和析构函数

+1:隐式副本是原因。它重复了很多次……但我找不到它们,因为问这个问题的人通常不知道隐式定义的副本构造函数:p我总是觉得很有趣,无知会阻止一个人学习,因为它会阻止一个人高效地查询。你的回答帮助很大。我现在尽可能地保留空间,不仅仅是向量。我的程序运行得更快。谢谢!
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
int main()
{
    vector<X> *vx = new vector<X>;
    vx->reserve(5);
    ....
---constructor
+++ copy constructor
***desctructor
---constructor
+++ copy constructor
***desctructor
...