【发布时间】:2019-02-09 16:08:47
【问题描述】:
我创建了一个类并创建了这个类的向量。我在析构函数中放了一条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
【问题讨论】:
-
尝试一个比
total_count = 5;更大的数字,你会发现每次push_back都不会发生重新分配,并且随着大小的增加它变得不那么常见(这是应该的是)。 -
顺便说一句,我建议你使用
myvec.reserve(5)和myvec.emplace_back(count)。那么所有的析构函数在myvec.clear()之前都是removed。 -
在您的析构函数中,您打印的信息并未显示正在发生的事情。如果您在析构函数中打印了
this的值而不是_id(并且还在构造函数中打印了this),您会看到this引用了不同的对象。那个不同的对象是什么——这就是你可以制定出正在发生的事情的地方,然后问“这个不同的对象来自哪里?”而不是“为什么我的析构函数被多次调用?”。 -
将日志记录添加到类的转换和复制构造函数中,这将使您更好地了解正在发生的事情。
temp(int id) : _id(id) { cerr << "converting constructor called. " << this << " ID: " << _id << endl; } temp(const temp &src) : _id(src._id) { cerr << "copy constructor called. " << this << " ID: " << _id << endl; } ~temp() { cerr << "destructor called. " << this << " ID: " << _id << endl; }
标签: c++ memory-management heap-memory