c++ - 为什么空 vector 会调用值类型的默认构造函数?

标签 c++ stl vector stdvector

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

#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 无关)

这个构造函数的另一个有趣的行为方面也引起了 S.O.周期性地:当请求的初始元素数量> 0时,它将这些元素从原型(prototype)参数复制构造到构造函数:

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

这有明显的性能成本,但也可能使应用程序崩溃如果垃圾内容包括例如复制构造函数只能假定的指针是有效的。同样,即使 push_back 也是极其危险的。这样一个未初始化的垃圾对象 - 它缺乏适当的值语义封装,并且可能会随着 vector 调整大小而被复制,算法操作如 std::sort()在 vector 等上执行。

关于c++ - 为什么空 vector 会调用值类型的默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6488323/

相关文章:

c++ - Qt5:如何使用QProcess进行批处理

c++ - 用 '*'(特殊字符)初始化一个 vector ,然后打印它

c++ - STL字符串比较方法与手动编写的方法之间存在巨大的时间差异

c++ - "backup"(复制)自定义对象的大型 STL vector 的快速方法

c++ - 具有堆栈和动态分配的容器

math - 3D 向量的哈希值

c++ - QHBoxLayout 中 QPushButton 周围的 Qt 空间

用于匹配 Windows 和 Posix 系统的日期时间的 C++ 正则表达式模式

python mpl : how to plot a point on a graph of 3D vectors, 和箭头头

c++ - 从(csv)的测试文件中读取并存储到房间对象中