TestDelete::TestDelete(int i) {
this->i = i;
std::cout <<"TestDelete constructor for "<<this->i<<"\n";
}
TestDelete::~TestDelete() {
std::cout <<"TestDelete destructor for "<<this->i<<"\n";
}
int main () {
std::vector<TestDelete> pt;
pt.push_back(TestDelete(1));
pt.push_back(TestDelete(2));
return 0;
}
上面的代码片段输出如下
TestDelete constructor for 1
TestDelete destructor for 1
TestDelete constructor for 2
TestDelete destructor for 1;
TestDelete destructor for 2;
TestDelete destructor for 1;
TestDelete destructor for 2;
我知道 push_back
的实现是基于复制交换概念,因此调用了临时对象的构造函数和析构函数。但是,如果您注意到对 object1
的析构函数进行了额外的调用。
有人可以解释一下这里发生了什么吗?
最佳答案
让我们看看您的实现可能会做什么:
std::vector<TestDelete> pt;
创建一个大小为 0 的 vector 。
pt.push_back(TestDelete(1));
重新分配大小为 1 的 vector 。通过复制构造(移动构造)临时元素添加新元素。
pt.push_back(TestDelete(2));
重新分配大小为 2 的 vector 。这意味着复制构造(或移动构造)先前创建的元素,并删除原始元素。通过复制构造(移动构造)临时元素来添加新元素。
Here is a live example ,还具有一项改进,可以防止 vector 重新分配。请注意,临时对象仍在被破坏,这让我感到惊讶;我猜编译器可以删除拷贝。
关于c++ - 在类对象的 vector 中调用额外的析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16709201/