使用 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/