【发布时间】:2020-11-20 00:50:53
【问题描述】:
#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
【问题讨论】:
-
移出的实例仍必须被销毁。
-
@underscore_d 但是第四个输出来自哪里?我数了 4 个实例,其中只有 3 个被销毁
-
您也没有跟踪移动构造,因此计数器没有在那里修改,而是通过破坏相同的残余物而被修改。通过在构造时记住每个对象的计数器,而不是仅仅报告它,更容易看出事情似乎向南发展了。如果你愿意,一个“id”。它还将迫使您意识到移动对象应清除该 id 以注意它不再指代具体构造(但仍需要销毁)。
-
emplace_back 可能会给出与 push_back 不同的结果,因为它可能不会生成 push_back 将生成的副本。
-
这是您的代码godbolt.org/z/ozxofc 的一个版本。我检测了复制构造函数并删除了
p。一切看起来井井有条
标签: c++ vector push-back stdmove