为什么C++类的析构函数需要构造?

jan*_*ver 8 c++ inheritance constructor destructor

我遇到的问题是在构造类时调用了我的类析构函数.考虑以下测试程序:

#include <iostream>
#include <vector>

using namespace std;

class X
{
public:
    X()  { cout << "X::X()" << endl; };
    ~X() { cout << "X::~X()" << endl; };
};

class Y : public X
{
public:
    Y() : X() { cout << "Y::Y()" << endl; };
    ~Y()      { cout << "Y::~Y()" << endl; };
};

int main() {
    vector<Y> a;
    a.resize(10);
    while(true) ;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出(来自循环之前)是

X::X()
Y::Y()
Y::~Y()
X::~X()
Run Code Online (Sandbox Code Playgroud)

我不明白上述代码段的行为:

  1. 为什么只构建一个元素?
  2. 为什么称为析构函数?

rod*_*igo 10

原型std::vector::resize()是:

void resize( size_type count, T value = T() );
Run Code Online (Sandbox Code Playgroud)

所以它创建了一个临时的默认值来插入向量(你的构造函数调用),然后它被复制构造10次到向量中(你不记录那些),然后临时被销毁(你的析构函数调用).

请注意,C++ 11的内容已经发生了变化.现在有两个重载:

void resize( size_type count );
void resize( size_type count, const value_type& value);
Run Code Online (Sandbox Code Playgroud)

因此,如果您使用正确的C++ 11编译器,您将调用第一个重载,并且您的值将被初始化,即它将使用默认构造函数.

  • @janoliver为什么这对你很重要?如果您的类管理内存(或其他资源),它*必须*遵循【三的规则(http://stackoverflow.com/q/4172722/1782465),因此它应该在复制就好存在工作(否则它只是灾难等待发生). (2认同)