Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-对象在超出范围和处于向量中时被销毁_C++_Arrays_Vector - Fatal编程技术网

C++ C++;-对象在超出范围和处于向量中时被销毁

C++ C++;-对象在超出范围和处于向量中时被销毁,c++,arrays,vector,C++,Arrays,Vector,为什么一个对象的析构函数在超出范围和在向量中时被调用? 例如: std::vector<Foo> vec; for (i=10; i<10; i++) { Foo object(i); vec.push_back(object); } std::向量向量向量机; 对于(i=10;i对象将消失在此范围之外,这是正确的。不,向量不会也不会影响其寿命。推回实际上将对象复制到向量中。为了避免这种情况,您可以使用C++11的放回,它允许在适当的位置构造Foo: vec.e

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

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

对于(i=10;i
对象
将消失在此范围之外,这是正确的。不,
向量
不会也不会影响其寿命。
推回
实际上将
对象
复制到
向量
中。为了避免这种情况,您可以使用C++11的
放回
,它允许在适当的位置构造
Foo

vec.emplace_back(i);
确认未执行复制、移动或额外销毁

Constructing A
End of vec's scope
Destructing A
  • push_back将对象的副本推送到向量
  • 对象实际上将被销毁,但一个副本将保留在向量中
  • 如果要在向量中推送对象的确切内容并使代码工作,请使用移动构造函数
这应该行得通

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

对于(i=10;iSyes;使用代码> ePosithRead <代码>,并在代码中建立<代码> FoO 。最终的代码是<代码>对象< /代码>,而不是<代码>对象< /代码>本身。<代码>对象< /代码>当它超出范围时被破坏;它的副本存在于向量内。从您的问题不清楚为什么您认为这是一个问题。问题,如果有的话,你想解决吗?我很困惑,认为向量是对象的指针,因为函数push_back通过引用获取对象。谢谢。引用不是指针(除非我们讨论编译器如何实现引用,但我们不是)。引用基本上是被引用实体的不同名称,在传递对象时经常使用。由于向量存储的是
Foo
,而不是
Foo&
,因此它将使用该引用来复制并构造自己的
对象
,在这一点上引用@Igor上面所说的内容。谢谢。虽然我知道引用不是一个指针,不能创建数组或引用。这仍然会创建一个临时的
Foo
,然后将其复制到向量中,然后立即销毁。净效果与原始代码完全相同(除了它使用的默认构造函数是
Foo
,而原始的构造函数使用的是
int
)。您可能指的是
vec.emplace_back(i);
vec.emplace_back();
-这确实构建了
Foo
的一个且唯一的实例(相应地使用一个参数或默认构造函数)。正确,我感到困惑。我后来在Coliru上进行实验时意识到。在这种情况下,push_back和emplace_back没有太大区别:再次-为了看到区别,将其设置为
vec.emplace_back()
我认为你的答案最适合我,因为我的对象的析构函数非常昂贵,所以最好只创建一个对象。哦,我没有抓住要点,也不知道如何使用emplace_back。我将据此编辑我的答案。谢谢!因此,如果我使用移动构造函数,对象不会破坏?它将被销毁但它的内容将被转移到向量中,不会进行复制。这更有效。托克,问题是在我的对象析构函数中,它会破坏另一个对象中的元素,所以我不希望它破坏这些元素。在这种情况下,我暂时不需要使用析构函数。这些元素是什么类型的?动态分配?然后尝试删除它并使用
shared\u ptr
。我没有看到你的所有代码。尝试移动并告诉我。它保留了对象的内容。如果没有,你需要向我发送更多代码或MP me。你应该删除
foo object(I);
,应该删除的