繁体   English   中英

为什么空向量调用值类型的默认构造函数?

[英]Why does an empty vector call the value type's default constructor?

使用g ++,我观察到创建一个大小为零的向量会调用向量的参数化对象类型的构造函数一次。 然后它被删除。 为什么会这样?

#include <iostream>
#include <vector>
using namespace std;

class s
{
    public:
    s() { cout << endl << "default s constructor" << endl; }
    ~s() { cout << endl << "default s destructor" << endl; }

};

int main()
{
    vector<s> v(0);
}

输出:

默认的构造函数

默认的析构函数

因为您显式传递初始大小,该大小调用具有另一个参数(默认值为s()的构造函数。 只要省略(0) (即std::vector<s> v; )就不会发生。

为了完整起见,标准23.2.4-2将您调用的构造函数定义为:

explicit vector(size_type n, const T& value = T() ,
const Allocator& = Allocator());

旁白(与C ++ 03相关但不与C ++ 11相关)

这个构造函数的另一个有趣的行为方面也定期提出SO:当请求的元素的初始数量> 0时,它将这些元素从原型参数复制构造到构造函数:

  • 人们经常使用一个默认的构造函数来保留成员变量未初始化,希望使vector(n)几乎与底层的免费存储分配一样快,但是
  • 复制构造函数仍被调用n次,以将原型对象的“垃圾”内容复制到每个请求的元素中

这具有明显的性能成本,但是如果垃圾内容包括例如复制构造器只能假设有效的指针,则也可能使应用程序崩溃。 类似地,即使push_back这样一个未初始化的垃圾对象也是非常危险的 - 它缺乏适当的值语义封装,并且可能在向量调整大小时被复制,像向量等执行算法操作,例如std::sort()

您正在调用的实际构造函数是(来自cplusplus.com):

explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );

因此,即使您只指定了大小,也会为第二个参数创建一个新的T对象,因此也会在构造函数结束时销毁它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM