为什么对象内部的vector成员变量会再次清除其元素呢?

mik*_*mke -1 c++ vector

如题。
下面是我的代码,这是最小可重现示例

啊

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)。

Hom*_*512 5

您忘记了向量在容量耗尽时可能必须移动元素。您的向量一开始为空,然后为一个条目分配容量,然后再次耗尽容量并重新分配两个条目,然后是四个、八个,依此类推。每次移动后,旧对象都会被销毁。这是观察它的最小变化:

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)