c++ - 为什么我的析构函数被多次调用?
问题描述
我创建了一个类并创建了这个类的向量。我cerr
在析构函数中放了一条消息,看看它什么时候被调用。我认为同一个析构函数被多次调用。这让我很困惑。
#include <iostream>
#include <vector>
using namespace std;
class temp {
private:
int _size = 1000;
int _myBall [1000];
int _id;
public:
temp(int id) : _id(id) {}
~temp() {
cerr << "destructor called. ID: " << _id << endl;
}
};
int main()
{
vector<temp> myvec;
int total_count = 5;
int count = total_count;
for(int count = 0;count < total_count; count++) {
cerr << "count: " << count << endl;
myvec.push_back(temp(count));
}
myvec.clear();
cerr << "Hello World" << endl;
system("pause");
return 0;
}
控制台输出:
count: 0
destructor called. ID: 0
count: 1
destructor called. ID: 0
destructor called. ID: 1
count: 2
destructor called. ID: 0
destructor called. ID: 1
destructor called. ID: 2
count: 3
destructor called. ID: 0
destructor called. ID: 1
destructor called. ID: 2
destructor called. ID: 3
count: 4
destructor called. ID: 0
destructor called. ID: 1
destructor called. ID: 2
destructor called. ID: 3
destructor called. ID: 4
destructor called. ID: 0
destructor called. ID: 1
destructor called. ID: 2
destructor called. ID: 3
destructor called. ID: 4
解决方案
由于每次std::vector
调整大小时都会进行复制,因此会调用析构函数。
std::vector
构建后重新分配预定数量的内存(足以容纳一些temp
实例) - 这就是capacity
. 每次push_back
调用时,它都会评估它是否仍有足够的内存分配来容纳新实例。一旦它被填满,它实际上会重新分配另一块内存(足以分配更多的temp
实例),然后复制(或移动,如果可能的话)所有现有的实例。这些是您看到记录的析构函数调用。
如果您事先知道该向量需要保存多少个实例,则可以reserve
达到该数量。
推荐阅读
- performance - 找到最近的移动“敌人”的最有效方法是什么?
- r - 删除了 1 行包含缺失值 (position_stack) 和 ggplot 不返回绘图
- flutter - Flutter Map 到自定义对象列表
- html - 使用 html 和 css 创建页面布局的任务(初学者)
- r - 调整闪亮的文本输出
- perl - 使用任何可行的方法(PERL、SED、AWK)将文件行中的信息提取到列中
- python - 如何获取两个标记之间的子字符串并在Python中重复该过程N次
- java - 是否可以从 .forEach 方法列出文件特征?
- ios - 无法生成进程“/usr/bin/touch”(执行格式错误)
- python - 如何在文件中显示时间?(Python)