将对象推送到向量时,为什么会破坏对象?

man*_*eak 1 c++

我想知道为什么我推回到向量中的元素会在这种情况下调用它的析构函数:

#include <iostream>
#include <vector>

class Foo
{
public:
    Foo(int a)
     : m_a(a)
    {
        std::cout << "Foo ctor() " << m_a << std::endl;
    }
    ~Foo()
    {
        std::cout << "Foo dtor() " << m_a << std::endl;
    }
private:
    int m_a;
};

class FooStorage
{
public:
    static void createFoo(int a)
    {
        m_foos.push_back(Foo(a));
    }

    static std::vector<Foo> m_foos;
};

std::vector<Foo> FooStorage::m_foos;

int main()
{
    std::cout << "Before: " << FooStorage::m_foos.size() << std::endl;
    FooStorage::createFoo(53);
    std::cout << "After: " << FooStorage::m_foos.size() << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这打印出以下内容:

Before: 0
Foo ctor() 53
Foo dtor() 53
After: 1
Foo dtor() 53
Run Code Online (Sandbox Code Playgroud)

我想知道:

  • 什么被删除?(在"之前"和"之后"之间)
  • 为什么会被删除?
  • 什么最终在向量中?

0x4*_*2D2 8

你在这里创建一个临时对象:

m_foos.push_back(Foo(a));
//               ^^^^^^
Run Code Online (Sandbox Code Playgroud)

当完整表达式结束时,将调用该对象的析构函数,但它将被复制(或移动)push_back()到向量中.

为了防止创建临时文件,您可以使用emplace_back()以下方法构建就地:

m_foos.emplace_back(a);
Run Code Online (Sandbox Code Playgroud)