c++ - 在类对象的 vector 中调用额外的析构函数

标签 c++

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/

相关文章:

C++ 窗口父子

javascript - 你会在你的应用程序中嵌入哪个 Javascript 引擎?

C++ ReadFile、CreateProcess、管道标准输出重定向、双倍输出

通过 COM 端口的 C++ 通信

c++ - C++ 中的指针和 const

c# - 从 C/C++ 到 C# 的转换

c++ - 什么时候应该使用 STL 算法而不是使用您自己的算法?

c++ - 带有 SOIL 的多重纹理

c# - 在虚幻引擎 C++ 中使用 C# 库

c++ - 我的代码不断返回 0 作为文本文件中的小数位数