c++ - vector 和push_back()

标签 c++ vector push-back stdmove

#include <iostream>
#include <vector>
#include <algorithm>

class my {
  public:
    my() {
      counter++;
      std::cout << "class constructor" << counter << " \n";}

    ~my() {
      std::cout << "class destructor" << counter << " \n";
      counter--;
    }
  
    static inline int counter = 0;
};

int main()
{
    my v1;
    std::vector<my> my_vec;

    my * p = new my();
    my_vec.push_back(std::move(*p));
    my_vec.push_back(std::move(v1));
}

只是一个例子,但是我不明白我做错了什么,结果我得到了 2 个额外的析构函数,比我预期的要多(预计 2 个)。谁能解释一下吗?

结果:

class constructor1
class constructor2
class destructor2
class destructor1
class destructor0
class destructor-1

最佳答案

逐步分析程序:

我的 v1;

创建一个实例,调用构造函数。

my * p = new my();

创建另一个实例,调用构造函数。

my_vec.push_back(std::move(*p));

第二个实例的拷贝被插入到 vector 中;调用隐式定义的移动构造函数(它只是复制;不打印输出)。

my_vec.push_back(std::move(v1));

vector 为2个实例分配新的存储空间,将之前存储的实例复制到新存储中(调用隐式定义的移动构造函数,它只是进行复制,但仍然没有输出),并且调用旧存储中实例的析构函数(因此打印第一个析构函数输出)。

然后, vector 超出范围,因此它包含的两个元素被销毁(因此,调用了 2 个析构函数)。然后,v1 超出范围,打印第四个析构函数调用。实例p被泄漏,即从未被销毁(内存泄漏)。

关于c++ - vector 和push_back(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63170401/

相关文章:

c++ - 如何在 C++ 类中使用 JNI registerNatives?

c++ - 在没有 MFC 的情况下在 Visual Studio 中拖放 UI 设计器?

c++ - 如何使用 map vector

c++ - 以二进制序列化和反序列化 vector

java - 将 vector 从 Matlab 传递到 Scala 类

c++ - 添加到std::vector时,类字段的行为异常

c++ #define 并连接大小写(我使用的是 gcc)

c++ - 我如何解决不允许模板化虚拟功能的问题

c++ - vector push_back 对元素地址的影响

c++ - 两个 std::vector 的 union 读取访问冲突