#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/