C ++ - 超出范围和向量时被破坏的对象

时间:2016-10-22 21:37:12

标签: c++ arrays vector

为什么对象的析构函数在超出范围时以及何时在向量中时被调用? 例如:

std::vector<Foo> vec;
for (i=10; i<10; i++)
{
   Foo object(i);
   vec.push_back(object);
} 

对象的析构函数是否被调用,因为它每次都超出范围?我可以在没有指针或shared_pointers的情况下使其工作吗?

3 个答案:

答案 0 :(得分:3)

  • push_back将对象的副本推送到向量
  • 对象实际上将被销毁,但副本将保留在向量中
  • 如果您想在向量中推送对象的确切内容并使代码有效,请使用移动构造函数

答案 1 :(得分:0)

object将死于此范围,这是正确的。不,vector不会影响其生命周期。 push_back实际上将object复制到vector。为避免这种情况,您可以使用C ++ 11 emplace_back,它允许就地构建Foo

vec.emplace_back(i);

manual installation guide确认没有执行复制,移动或额外破坏。

Constructing A
End of vec's scope
Destructing A

答案 2 :(得分:0)

这应该有效

std::vector<Foo> vec;
for (i=10; i<10; i++)
{
   vec.emplace_back(i);
}