如题。
下面是我的代码,这是最小可重现示例
啊
class B {
public:
string n;
B(string name) {
this->n = name;
cout << this->n<< " create" << endl;
}
~B() {
cout << this->n << " destory" << endl;
}
};
class A {
public:
vector<B> m_B;
A():m_B(vector<B>{}) {
cout << "class A create" << endl;
};
~A() {
cout << "class A destory" << endl;
};
};
Run Code Online (Sandbox Code Playgroud)
主程序
#include "a.h"
void addItem(A& _a,string n) {
_a.m_B.emplace_back(n);
};
int main()
{
A a;
addItem(a, "a");
addItem(a, "b");
std::cout << a.m_B.size() <<"\n";
std::cout << "Hello World!\n";
}
Run Code Online (Sandbox Code Playgroud)
终端输出是
class A create
a create
b create
a destory
2
Hello World!
class A destory
a destory
b destory
Run Code Online (Sandbox Code Playgroud)
我想知道为什么第四行多了一句(a destory)?
起初,我认为这是由于 addItem 函数中的“push_back”造成的,
但是当我使用“emplace_back”时,我得到了相同的结果。
谢谢大家。
知道为什么第四行多了一句(a destory)。
您忘记了向量在容量耗尽时可能必须移动元素。您的向量一开始为空,然后为一个条目分配容量,然后再次耗尽容量并重新分配两个条目,然后是四个、八个,依此类推。每次移动后,旧对象都会被销毁。这是观察它的最小变化:
class B {
public:
string n;
B(string name) {
this->n = name;
cout << this->n<< " create" << endl;
}
B(B&& o) noexcept
: n(std::move(o.n))
{ cout << "move " << this->n << '\n'; }
~B() {
cout << this->n << " destory" << endl;
}
};
class A {
public:
vector<B> m_B;
A():m_B(vector<B>{}) {
cout << "class A create" << endl;
};
~A() {
cout << "class A destory" << endl;
};
};
void addItem(A& _a,string n) {
_a.m_B.emplace_back(n);
};
int main()
{
A a;
addItem(a, "a");
std::cout << "Capacity " << a.m_B.capacity() << '\n';
addItem(a, "b");
std::cout << "Capacity " << a.m_B.capacity() << '\n';
addItem(a, "c");
std::cout << "Capacity " << a.m_B.capacity() << '\n';
std::cout << a.m_B.size() <<"\n";
std::cout << "Hello World!\n";
}
Run Code Online (Sandbox Code Playgroud)
印刷
class A create
a create
Capacity 1
b create
move a
destory
Capacity 2
c create
move a
move b
destory
destory
Capacity 4
3
Hello World!
class A destory
a destory
b destory
c destory
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |