我已经创建了一个类并创建了这个类的 vector 。我在析构函数中放置了一条 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
实例)——这就是 容量
。每次调用 push_back
时,它都会评估是否仍有足够的内存分配给新实例。一旦它被填满,它实际上会重新分配另一 block 内存(足以分配更多的 temp
实例),然后复制(或移动,如果可能的话)所有现有实例。这些是您看到的已记录的析构函数调用。
如果您事先知道 vector 需要保存多少个实例,您可以保留
它到那个数量。
关于c++ - 为什么我的析构函数被多次调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54608026/