gpt4 book ai didi

c++ - 为什么将对象推向 vector 时对象会被破坏?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:26:01 36 4
gpt4 key购买 nike

我想知道为什么在这种情况下我推回 vector 的元素会调用其析构函数:

#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;
}

这会打印出以下内容:

Before: 0
Foo ctor() 53
Foo dtor() 53
After: 1
Foo dtor() 53

我想知道:

  • 什么被删除了? (在“之前”和“之后”之间)
  • 为什么会被删除?
  • vector 中的结果是什么?

最佳答案

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

m_foos.push_back(Foo(a));
// ^^^^^^

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

要防止创建临时文件,您可以使用 emplace_back() 就地构造:

m_foos.emplace_back(a);

关于c++ - 为什么将对象推向 vector 时对象会被破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26802090/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com